Swift:如何从另一个控制器设置IBOutlet?

时间:2015-05-05 09:26:15

标签: ios swift uilabel

我想要隐藏我的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无法通过这种方式无法访问。

提前致谢!

2 个答案:

答案 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隐藏/显示您的标签之后。