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

Swift : How to set IBOutlet from another controller?

我想隐藏我的 IBOutlet。但是,将文本设置为 empy 字符串工作得很好,但是当我直接访问我的 IBOutlet 时,我不断收到 "unexpectedly found nil while unwrapping optional value" 的错误。

我尝试将我的 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 时程序崩溃。显然,正如我之前所说,我可以轻松访问文本 属性 并将其设置为空字符串,但我想知道为什么 IBOutlet 无法通过这种方式访问​​。

提前致谢!

您遇到的问题是,您在 viewControllerAtIndex 方法中尝试设置插座,但视图控制器 (PageContentViewController) 未加载到视图层次结构中,因此插座仍然为零。

您可以使用的解决方案之一是向 PageContentViewController 添加 属性 例如 isHidden 并在 viewDidAppear 中检查 属性 并隐藏或显示视图:

var isHidden:Bool = true 
override func viewDidAppear(animated: Bool) {
    superviewDidAppear(animated)

    self.Test.hidden = isHidden
}

viewControllerAtIndex方法中将测试控件的设置隐藏属性的行更改为isHidden:

if(index == 2){

    pageContentViewController.isHidden = true
    }
    else {
        pageContentViewController.isHidden = false
    }

您已声明 " var Test:UILabel! "not optional, 所以在这种情况下,首先你必须初始化它。 你是直接访问它的属性而不初始化,这是不可能的。

要么您需要将 Test 创建为 " var Test:UILabel? ",然后以编程方式创建 Test 并设置其所有其他属性,如文本和所有。

或者您可以在下一个 class PageContentViewController 中创建 Boolean variable,设置布尔变量值而不是设置 " pageContentViewController.Test.hidden " 值,然后在 PageContentViewController 之后hide/show 你的标签。