尽管在 IB 中链接,但标签仍为 nil

Posted

技术标签:

【中文标题】尽管在 IB 中链接,但标签仍为 nil【英文标题】:Label is found as nil despite being linked in IB 【发布时间】:2016-11-21 21:47:28 【问题描述】:

Swift3/Xcode 8.1

以下代码...

class PageContentVC: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate

    var array = [String]()
    var currentIndex = 0

    override func viewDidLoad() 
        super.viewDidLoad()

        array = ["1","2","3","4"]

        self.dataSource = self
        self.delegate = self
        self.setViewControllers([helperFunction(index: currentIndex)], direction: .forward, animated: true, completion: nil)

    

    func helperFunction(index: Int) -> UIViewController


        let newVC = storyboard?.instantiateViewController(withIdentifier: "PageContent") as! PageContent

        print("currentIndex is: \(currentIndex)")
        print("value at currentIndex is: \(array[currentIndex])")

        newVC.PageContentLabel.text = array[currentIndex]

        return newVC
    

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?

        if (currentIndex ==  0) || (currentIndex == NSNotFound) 
            return nil
        
        currentIndex -= 1
        return helperFunction(index: currentIndex)
    

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?

        if (currentIndex == array.count - 1) || (currentIndex == NSNotFound) 
            return nil
        
        currentIndex += 1
        return helperFunction(index: currentIndex) 
     

...在以下行中使用“Unexpectedly found nil while unwrapping an optional value”错误使应用程序崩溃:

newVC.PageContentLabel.text = array[currentIndex]

'PageContentLabel' 肯定是通过界面生成器链接的,当我注释掉有问题的行时,应用程序运行良好。

我在这里错过了什么?

【问题讨论】:

你确定 newVC 不是 nil 吗? 【参考方案1】:

标签是nil,因为您已经实例化了视图控制器,但是在故事板中定义的视图层次结构(如在 IB 中配置的那样)在相应的视图出现之前不会构建。您应该在您的视图控制器中添加一个字符串属性并让helperFunction 填充它,而不是IBOutlet。然后,PageContentviewDidLoad 应该采用该字符串属性并使用它来设置UILabeltext。最重要的是,在调用viewDidLoad 之前不要尝试使用这些插座。

【讨论】:

非常感谢!已排序!【参考方案2】:

使用插座不是更简单吗?

@IBOutlet weak var PageContentLabel: UILabel!

从情节提要中的 UILabel 中按住 ctrl 拖动到类正下方的 PageContentVC 文件中,然后创建一个插座并为其命名。

【讨论】:

问题是他试图进入另一个视图控制器并设置一个标签,这是一个糟糕的设计。请参阅 Rob 的回答。

以上是关于尽管在 IB 中链接,但标签仍为 nil的主要内容,如果未能解决你的问题,请参考以下文章

UILabel 子类 - 尽管标签高度正确,但文本在底部被截断

Puppeteer:点击一个标签,等待新页面从链接加载,然后截图

尽管不使用自动播放标签,但 HTML 音频在页面加载时播放

尽管尺寸正确,但标签栏图标太小

尽管 for=id,单击标签不会集中输入

在 IB 中为 UILabel 设置 HTML 文本