【问题标题】:Why is this variable not printing in this function?为什么这个变量不在这个函数中打印?
【发布时间】: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


【解决方案1】:

问题似乎在于您的登录视图控制器。您将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's 委托设置为 @987654328 @。那么你的登录逻辑可以是:

if(returnValue != "error") {
    self.delegate?.userLoggedIn(data: userEmail!)
    UserDefaults.standard.set(true, forKey: "isUserLoggedIn")

    self.dismiss(animated: true, completion: nil)                
}

【讨论】:

  • 我也想过这个问题,目前正在尝试调试他的问题,但我得到了一个打印now here Test
  • 因此,即使他的代码错误,该值也会被打印出来
  • 这个答案仍然打印 nil
  • 抱歉,我不知道你可以这样打印。我已经用我认为的实际问题更新了我的答案。
  • 我刚刚在上面尝试过这段代码——但这会消除“受保护”视图控制器页面在启动时不显示的功能。如果我使用此代码,您会在 LoginViewController 弹出顶部之前看到受保护的页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 2020-08-07
  • 2016-01-17
  • 2022-11-26
相关资源
最近更新 更多