【发布时间】:2016-10-15 18:39:44
【问题描述】:
当 ViewController 加载时,会打印正确的值。但是当尝试使用 UIButton 打印相同的值时,打印的是 nil
视图控制器
var userEmail: String?
func userLoggedIn(data: String) {
userEmail = data //sent from delagate
print(userEmail) // successfully printed
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "loginView" {
let loginViewController: LoginViewController = segue.destination as! LoginViewController
loginViewController.delegate = self
}
}
override func viewDidAppear(_ animated: Bool) {
let isUserLoggedIn = UserDefaults.bool(UserDefaults.standard)(forKey: "isUserLoggedIn")
if(!isUserLoggedIn) {
self.performSegue(withIdentifier: "loginView", sender: self);
}
}
@IBAction func createCommunityTapped(_ sender: AnyObject) {
let createCommunityController = self.storyboard?.instantiateViewController(withIdentifier: "CreateNewCommunity") as! CreateNewCommunity
print ("now here ", userEmail) // prints nil
createCommunityController.myEmail = userEmail
}
userEmail 值是通过这段代码从 LoginViewController 传递过来的:
if(returnValue != "error") {
self.delegate?.userLoggedIn(data: userEmail! )
UserDefaults.set(UserDefaults.standard)(true, forKey: "isUserLoggedIn");
let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "ViewController")
let mainPageNav = UINavigationController(rootViewController: mainPage!)
let appDelegate = UIApplication.shared.delegate
appDelegate?.window??.rootViewController = mainPageNav
self.dismiss(animated: true, completion: nil)
}
AppDelegate:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let isUserLoggedIn = UserDefaults.bool(UserDefaults.standard)(forKey: "isUserLoggedIn")
if(!isUserLoggedIn) {
let loginViewController = mainStoryboard.instantiateViewController(withIdentifier: "LoginViewController")
self.window?.rootViewController = loginViewController
window!.makeKeyAndVisible()
} else {
let protectedPage = mainStoryboard.instantiateViewController(withIdentifier: "ViewController")
self.window?.rootViewController = protectedPage
window!.makeKeyAndVisible()
}
return true
}
【问题讨论】:
-
在加载 CreateNewCommunity 之前尝试打印
-
它会在我加载 CreateNewCommunity 之前打印,但我希望它在我单击按钮时打印,以便我知道变量正在传递给我想要传递的函数。
-
另外,loginViewController 被解散时会发生什么,你在那里做什么?
-
loginViewController 通过委托直接将值 userEmail 传递给 func userLoggedIn(data: String)。我想我的问题是它被困在该函数中......我如何从那里取出数据以便我可以在类中的其他函数中使用它?
-
您说您已正确地将数据传递给 userLoggedIn(:String) 函数中的 userEmail var,然后它应该正确更新您的本地变量 userEmail。接下来,我假设您点击按钮调用 createCommunityTapped(:Anyobject)。如果是这种情况,那么您应该能够在函数 createCommunity 的第一行中执行 print(userEmail) 。我没有看到任何问题!
标签: ios swift xcode swift3 xcode8