Ios 为什么此函数中不打印此变量?

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

加载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
}
用户电子邮件值通过以下代码段从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弹出页面顶部之前看到受保护页面。