Ios 为什么此函数中不打印此变量?
加载ViewController时,将打印正确的值。但当尝试使用UIButton打印相同的值时,打印结果为Ios 为什么此函数中不打印此变量?,ios,swift,xcode,swift3,xcode8,Ios,Swift,Xcode,Swift3,Xcode8,加载ViewController时,将打印正确的值。但当尝试使用UIButton打印相同的值时,打印结果为nil 视图控制器 var userEmail: String? func userLoggedIn(data: String) { userEmail = data //sent from delagate print(userEmail) // successfully printed } override func prepare(for segue: UISto
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
}
用户电子邮件值通过以下代码段从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
}
问题似乎在于您的登录视图控制器。您正在将
userEmail
传递给ViewController
的第一个实例,然后创建ViewController
的一个新实例,并将其设置为根,从而释放第一个实例。第一步应删除此代码:
let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "ViewController")
let mainPageNav = UINavigationController(rootViewController: mainPage!)
let appDelegate = UIApplication.shared.delegate
appDelegate?.window??.rootViewController = mainPageNav
在AppDelegate中,您应该将根视图控制器设置为ViewController
,并且如果用户未登录,则应在其上方显示LoginViewController
。确保将LoginViewController的
委托设置为ViewController
。然后,您的登录逻辑可以是:
if(returnValue != "error") {
self.delegate?.userLoggedIn(data: userEmail!)
UserDefaults.standard.set(true, forKey: "isUserLoggedIn")
self.dismiss(animated: true, completion: nil)
}
尝试打印,在加载CreateNewCommunity之前,它在我加载CreateNewCommunity之前会打印,但我希望在单击按钮时打印它,这样我就知道变量正在到达函数,因为我想传递它。另外,当loginViewController被解除时会发生什么?您在那里做什么吗?loginViewController通过委托将值userEmail直接传递到func userLoggedIn(数据:String)。我想我的问题是它被困在这个函数中。。。如何从中获取数据,以便在类中的其他函数中使用它?您说过您已正确地将数据传递到userLoggedIn(:String)函数中的userEmail var,然后它应正确地更新局部变量userEmail。接下来,我假设您点击按钮调用CreateComunityTapped(:Anyobject)。如果是这种情况,那么您应该能够在函数createCommunity fine的第一行执行print(userEmail)。我看没什么问题!我也考虑过这一点,目前正试图调试他的问题,但我得到了一个打印
现在这里测试
,所以即使他的代码不好,值也会打印出来,仍然打印为nil,这个答案啊抱歉,我不知道你可以这样打印。我已经用我认为是实际问题的东西更新了我的答案。我刚刚尝试了上面的代码-但这会使“受保护”视图控制器页面的功能在启动时不显示。如果我使用此代码,您会在LoginViewController弹出页面顶部之前看到受保护页面。