gpt4 book ai didi

swift - 尝试在 Controller 之间传递信息失败,但可以从 AppDelegate 到 Controller

转载 作者:行者123 更新时间:2023-11-28 06:19:23 25 4
gpt4 key购买 nike

我有两个 UIViewControllers,vc1 和 vc2。 vc1 嵌入在 UIViewController 中,而 UIViewController 嵌入在 UITabBarController 中,但 vc2 均未嵌入。

如何将信息从 vc2 传递到 vc1?在用户执行一个操作后,数据被保存并且 vc2 简单地关闭,所以没有一个 segue 来传递信息。显然我无法通过导航堆栈或 TabController 引用 vc1。

我可以保存到 AppDelegate,但我了解到这不是一个好的做法。

这是我用来将信息从 AppDelegate 传递到 vc1 的代码 我在 vc2 中尝试过,但显然失败了。:

let tabBarController = window!.rootViewController as! UITabBarController
if let tabBarViewControllers = tabBarController.viewControllers {
let navPostViewController = tabBarViewControllers[0] as! UINavigationController

let user = User(context: managedObjectContext)

if user.userID != nil {
print("User is loggedIn")
isUserLoggedIn = true
} else {
print("User is not loggedIn")
isUserLoggedIn = false
}
let postViewController = navPostViewController.topViewController as! PostViewController
postViewController.managedObjectContext = managedObjectContext
}

最佳答案

首先,我从来没有养成使用 segue 传递信息的习惯。我建议您在需要在两个对象之间传递数据时实现委托(delegate)模式。它更清洁。

例如,假设您想在 LoginViewControllerPostViewController 之间传递数据:

protocol LoginViewControllerDelegate:NSObjectProtocol{
func userDidLogin(data:String)
}


class LoginViewController:UIViewController {
weak var delegate:LoginViewControllerDelegate?
...


@IBAction func loginButtonPressed(sender:UIButton) {
//Perform login logic here

//If successful, tell the other controller or the 'delegate'
self.delegate?.userDidLogin(data:"Some data....")
}

}

class PostViewController:UIViewController, LoginViewControllerDelegate {
func userDidLogin(data:String) {
print("Got data from login controller: \(data)")
}
}


//How you might use this
loginViewController.delegate = postViewController

要记住的一个警告是永远不要尝试在两个对象之间建立强引用,即不要让对象相互保持,否则会导致内存泄漏。

关于swift - 尝试在 Controller 之间传递信息失败,但可以从 AppDelegate 到 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140711/

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