gpt4 book ai didi

ios - 如何从现有的 View Controller 类中调用函数?

转载 作者:可可西里 更新时间:2023-11-01 02:19:34 25 4
gpt4 key购买 nike

我仍然是早期的 Swift 开发人员。我正在尝试创建一个功能,我点击屏幕上的一个按钮,然后 iPhone 提示我允许位置,当我点击允许时,我会自动导航到另一个屏幕。

到目前为止,我已经做了以下事情:

  • 创建了一个单独的类(“用户”),其中处理所有定位功能
  • 在第一个 View Controller 上设置一个按钮和从“用户”调用位置提示功能的适当 IBAction
  • 为第一个和第二个 View Controller 添加 Storyboard ID
  • 在执行到另一个 View 的导航的第一个 View Controller 类中创建了一个函数(“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 Controller 类中的代码

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 )

}

附言。我知道我可以将所有代码合并到一个类中,并且它可以像那样工作。但我想以“正确”的方式做到这一点,在不同的类中具有不同的功能。

最佳答案

  • 尝试设置 first = self ,不要实例化一个新的 View Controller
  • 如果使用 Storyboard,最好使用 segues 显示另一个屏幕

虽然这里正确的做法是拥有一个 UserDelegate 协议(protocol)

协议(protocol) UserDelegate {
功能显示其他屏幕()
}

然后在 User 中添加 var delegate: UserDelegate?并在 locationManager 函数中而不是调用firstView!.showSecondScreen 调用delegate?.displayOtherScreen( )

然后让FirstView采用UserDelegate协议(protocol)

class FirstView: UIViewController, UserDelegate {
var newUser = User()

override func viewDidAppear(animated: Bool) {
newUser.delegate = self
...
}
...
...
func displayOtherScreen( ) {
showSecondSceen( )
}

现在不需要第一个变量..

关于ios - 如何从现有的 View Controller 类中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31780469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com