2015-10-06 75 views
-1

我尝试访问Viewdidload和IBAction之外的某些IBOutlet,并始终获取nil值。在Viewdidload和IBAction中,这些值都可以。我错过了宣布或初始化某些内容的部分吗?IBOutlet在ViewController方法中始终为零,但在IBAction&Viewdidload中没问题

该值在viewdidload()之后被修改,因为viewdidload被称为IBAction。

视图是在故事板中创建的,来自UINavigation控制器。

connection table between ViewController and UIView:

的登录服务器方法由userCredential代表呼吁,如下:

protocol userCredentialDelegate { 
    func didUpdateCredential (sender:String, credential: Bool?) 
} 

class userCredential: NSObject { 

var delegate:userCredentialDelegate? 
// self.delegate = ViewController() removed 

func loginServer (name: String, pwd: String) -> Bool { 
dispatch_sync(dispatch_get_main_queue()) 
    { 
    self.delegate?.didUpdateCredential ("login", credential: credentialStatus) 
    } 
} 

主控制器:

class ViewController: UIViewController, userCredentialDelegate { 

// set the shared instance 
let user = userCredential.sharedInstance 

@IBOutlet weak var incorrectCredentials: UITextField! 
@IBOutlet weak var username: UITextField! 
@IBOutlet weak var password: UITextField! 
@IBOutlet weak var logButton: UIButton! 

@IBAction func logButton(sender: UIButton) { 
    print (incorrectCredentials?.hidden) 
    if logButton.titleLabel!.text == "Log Out" { 
     user.logoutServer() 
    } else { 
     user.loginServer(username.text!, pwd: password.text!) 
    } 
} 

func didUpdateCredential (sender: String, credential: Bool?) { 
    switch sender { 
    case "login": 
     if credential! { 
      performSegueWithIdentifier("loginSegue", sender: self) 
     } else { 
      incorrectCredentials?.hidden = false 
     } 
    default: break 
    } 
    if let credentialResponse = credential { 
     loginStatus = credentialResponse 
     } 
    } 

var loginStatus: Bool = false { 
    didSet { 
     if loginStatus { 
      incorrectCredentials?.hidden = true     // always nil before, now ok 
     } else { 
      incorrectCredentials?.hidden = false     // always nil before, now ok 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    user.delegate = self 
    incorrectCredentials.hidden = true // can work here 
    user.getUserInfo() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

connection table:

+0

你可以在你的笔尖上做一个截图,你在哪里连接了插座到你的控制器? IBoutlets应该很弱,所以在var之前放弱。 –

+0

tks。已经用弱和附加图片更新了代码。 –

+0

仍然无法正常工作? –

回答

1

您需要在您的viewDidLoad函数中将委托设置为您的用户模型。 做user.getUserInfo()之前,请user.delegate = self

当前创建的用户模式,即没有任何待办事项与您实际加载的ViewController一个新的实例。

+0

我已经更新了代码:add user.delegate = self并删除用户中的self.delegate = Viewcontroller。仍然看到那些零值。我从用户的控制台self.delegate打印,并可以看到正确的数据:,所以不知道什么是错的。将调查(我添加了投票给你的答案,但看不到,我刚到达Stackoverflow)。 –

+0

我刚刚删除user.getUserinfo(),现在可以正确看到这些值。 user.getUserInfo也搞乱了这个委托。非常感谢Björn。现在已经停留了一天。 –

+0

哦,太棒了,也许发布你的userGetInfo函数,我们可以找到错误 –