【问题标题】:Swift : How to set IBOutlet from another controller?Swift:如何从另一个控制器设置 IBOutlet?
【发布时间】:2015-05-05 09:26:14
【问题描述】:

我想隐藏我的 IBOutlet。但是,将文本设置为空字符串效果很好,但是当我直接访问我的 IBOutlet 时,我不断收到“在展开可选值时意外发现 nil”的错误。

我尝试将我的 IBOutlet 设置为本地变量,但它也给出了错误。我准备了一些代码 sn-ps 删除了不相关的行,只是为了更好地暴露我的问题而不提供太多代码:

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 无法通过这种方式访问​​。

提前致谢!

【问题讨论】:

    标签: ios swift uilabel


    【解决方案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
        }
    

    【讨论】:

    • 现在self.Test.hidden = isHidden出现错误
    • @DCDC 你遇到了什么错误?您是否创建了测试标签?我可以看到 LabelTop 是一个 Outlet,所以你在 IB 中添加了它,但 Test 不是 IBOutlet,所以我假设你在 viewDidAppear 被触发之前创建了它。
    • 好吧,这个 Test 变量是搞砸的东西。当我直接访问 UIlabel 时 self.LabelTop 错误不再发生
    【解决方案2】:

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

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

    或者您可以在下一个课程PageContentViewController 中创建Boolean variable,设置布尔变量值而不是设置" pageContentViewController.Test.hidden " 值,然后在PageContentViewController 中隐藏/显示您的标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多