我想要隐藏我的IBOutlet。但是,将文本设置为empy字符串的工作完全正常,但是当我直接访问我的IBOutlet时,我不断收到“在解开可选值时意外发现nil”的错误。
我尝试将我的IBOutlet设置为局部变量,但它也会出错。我准备了一些代码片段,删除了不相关的行,只是为了更好地揭示我的问题而不提供太多代码:
PageContentViewController
@IBOutlet weak var LabelTop: UILabel!
var Test:UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.LabelTop = self.Test
}
PageViewController
func viewControllerAtIndex(index: Int)-> PageContentViewController?{
if((self.pageTitles.count == 0) || (index >= self.pageTitles.count))
{
return nil
}
var pageContentViewController: PageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
pageContentViewController.imageFile = self.pageImages[index]
pageContentViewController.titleText = self.pageTitles[index]
pageContentViewController.pageIndex = index
if(index == 2){
pageContentViewController.Test.hidden = true
}
else {
pageContentViewController.Test.hidden = false
}
return pageContentViewController
}
尝试访问if语句中的UIlabel时程序崩溃。显然,正如我之前所说,我可以轻松访问text属性并将其设置为空字符串,但我想知道为什么IBOutlet无法通过这种方式无法访问。
提前致谢!
答案 0 :(得分:1)
您遇到的问题是,在viewControllerAtIndex
方法中,您尝试设置插座但视图控制器(PageContentViewController)未加载到视图层次结构中,因此插座仍为零。
您可以使用的解决方案之一是向PageContentViewController添加一个属性,例如isHidden
,并在viewDidAppear中检查该属性并隐藏视图或显示它:
var isHidden:Bool = true
override func viewDidAppear(animated: Bool) {
superviewDidAppear(animated)
self.Test.hidden = isHidden
}
viewControllerAtIndex
方法中的将设置Test控件的隐藏属性的行更改为isHidden:
if(index == 2){
pageContentViewController.isHidden = true
}
else {
pageContentViewController.isHidden = false
}
答案 1 :(得分:1)
您已宣布" var Test:UILabel! "
为not optional
,
所以在这种情况下,首先你必须初始化它。
您无需初始化即可直接访问其属性,但这是不可能的。
要么你需要创建Test " var Test:UILabel? "
,然后以编程方式创建Test并设置其他所有属性,如text和all。
或者您可以在下一个班级Boolean variable
中创建PageContentViewController
,设置布尔变量值而不是设置" pageContentViewController.Test.hidden "
值,然后在PageContentViewController
隐藏/显示您的标签之后。