【问题标题】:Loading UIView from XIB using Storyboard - view's properties are nil [duplicate]使用 Storyboard 从 XIB 加载 UIView - 视图的属性为零 [重复]
【发布时间】:2019-10-01 11:48:18
【问题描述】:

我已经创建了一个视图:

import UIKit

class TestNotWorkingView: UIView {
    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var label2: UILabel!
    @IBOutlet weak var label3: UILabel!
}

并与对应的XIB连接:

然后,我将视图添加到 Storyboard 上的 UIViewController:

class ViewController: UIViewController {
@IBOutlet weak var testNotWorkingView: TestNotWorkingView!
override func viewDidLoad() {
    super.viewDidLoad()
    print(testNotWorkingView)
    print(testNotWorkingView.label1)
}

}

当我运行应用程序时,只显示父视图。没有可见的标签:

父视图:

可选(TestProject.TestNotWorkingView: 0x7fb165e04610; frame = (0 0; 414 818);自动调整大小 = RM+BM;层 = CALayer: 0x600001f254e0)

查询其中一个标签

我已经将TestNotWorkingView 设置为视图的类和文件所有者。

我假设由于情节提要上不存在视图,因此它们不会在运行时创建和链接。

如何在 Storyboard 中创建的 ViewController 中使用 XIB 中创建的视图?有可能吗?

Test Project that fully reproduces the issue

【问题讨论】:

    标签: ios xcode storyboard interface-builder xib


    【解决方案1】:

    使用在 xib 中设计的视图可能有点棘手,您需要将此代码添加到您的 TestNotWorkingView 类中:

    override func awakeAfter(using aDecoder: NSCoder) -> Any? {
        guard subviews.isEmpty else {
            return self
        }
        return Bundle.main.loadNibNamed("TestNotWorkingView", owner: nil, options: nil)?.first
    }
    

    编辑:另外,您应该将 File's Owner 留空,并将 outlet 仅连接到 TestNotWorkingView

    【讨论】:

    • 没有解决问题 - pastebin.com/LEf4Wg9Y
    • @RichardTopchiy 糟糕,我忘了说您需要将 File's Owner 留空,并连接任何插座而不是文件所有者来查看。
    • 与您的第二个建议结果相同
    • 这可能有效,也可能无效......“Ben Patch”在这个问题上的答案(建议重复)stackoverflow.com/questions/9282365/… 更加灵活和可靠。
    • 那个确实有效
    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 2013-07-31
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多