Я все еще на ранней стадии разработки Swift. Я пытаюсь создать функцию, когда я нажимаю кнопку на экране, после чего я получаю запрос от iPhone, чтобы разрешить местоположение, и когда я нажимаю «Разрешить», я автоматически перехожу на другой экран.Как я могу вызвать функцию из существующего класса View Controller?
До сих пор я сделал следующие вещи:
- создал отдельный класс («Пользователь»), где все функции определения местоположения обрабатываются
- Setup кнопку на первом контроллере представления, соответствующий ему IBAction, что вызывает быструю функцию определения местоположения от «пользователя»
- Добавлены раскадровки идентификаторов для первого и второго контроллера представления
- создал функцию («changeScreen») в первом классе контроллера вида, который выполняет навигацию к другой точке зрения
- Настройки слушатель в классе «User», когда пользователь нажал разрешить местоположение, который затем называет «changeScreen» функцией
Я думаю, что есть еще один способ сделать это (вызов какого-то обработчик завершения) и я играл с этим в течение 1-2 часов, и ничего не работало. До сих пор это решение почти полностью работает, но я получаю следующее сообщение об ошибке:
Warning: Attempt to present ____ on _____ whose view is not in the window hierarchy!
Вот код в моем классе «Пользователь»
class User: NSObject, CLLocationManagerDelegate {
func getLocation(){
// For use in foreground
locationManager.requestWhenInUseAuthorization()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
//locationManager.startUpdatingLocation()
println("hello location")
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status:CLAuthorizationStatus){
if status == .AuthorizedWhenInUse {
locationManager.startUpdatingLocation()
firstView!.showSecondScreen() // this is where I call the other class's function
}
}
}
Вот код в моем первом классе View контроллера
var firstView: FirstView? = nil
class FirstView: UIViewController {
var newUser = User()
override func viewDidAppear(animated: Bool) {
firstView = self.storyboard!.instantiateViewControllerWithIdentifier("firstView") as? FirstView
// here i take the first view controller class and store it into a public variable
}
@IBAction func allowLocationBtn(sender: AnyObject) {
newUser.getLocation() // this is the first button clicked
}
func showSecondScreen(){
let secondScreen = self.storyboard!.instantiateViewControllerWithIdentifier("SecondScreen") as! SecondScreen
self.presentViewController(secondScreen, animated: true, completion: nil )
}
Пс. Я знаю, что я могу объединить весь код в один класс, и все могло бы работать так. Но я хочу сделать это «правильным» способом, иметь разные функциональные возможности в разных классах.
Как вы показываете FirstView в окне? – Amit89
Эй, Амит, я показываю FirstView на раскадровке, просто обычный объект View Controller, и я связал его с классом «FirstView». Отвечает ли это на ваш вопрос? – trixmasta
- вам нужно установить 'first = self', не создавая новый viewcontroller – Azzaknight