ios 如何访问XIB内部的变量

new9mtju  于 2022-12-20  发布在  iOS
关注(0)|答案(1)|浏览(91)

我已经创建了一个名为UserInfoView的可重用自定义视图和一个XIB文件,我希望将其嵌入到故事板中。
1.我在XIB文件中将根视图的类以及定制视图的File的Owner设置为UserInfoView
1.我在XIB文件和Swift文件中创建了标签,并通过File 's Owner将它们链接起来。

final class UserInfoView: UIImageViewX {
    @IBOutlet weak var locationLabel: UILabel!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var ageLabel: UILabel!
}

1.我在主故事板中创建了一个视图,并将类设置为UserInfoView
1.最后,我在主视图控制器的Swift文件中创建了一个名为userInfoView的变量,并将其与#3中的视图相链接。

final class MainViewController: UIViewController {
   @IBOutlet weak var userInfoView: UserInfoView!
}

当我运行模拟器时,它运行时没有任何错误。然而,有两个问题。
首先,当我试图访问UserInfoView中的变量(如locationLabel)时,会导致nil错误。

userInfoView.locationLabel.text = "location" // error

第二,除了在故事板中设置UserInfoView之外,我还使用工厂方法在视图控制器中生成了相同的对象,但是,我得到了键/值编码错误,即自定义视图中的标签没有链接。

Bundle.main.loadNibNamed("UserInfoView", owner: self, options: nil)?[0] as? UserInfoView

此类与密钥ageLabel的密钥值编码不兼容
当我在故事板中查看UserInfoView时,我在自定义视图中看到了未链接的标签outlet,但是当我尝试链接它们时,它们似乎没有连接故事板中的任何元素。

kxkpmulp

kxkpmulp1#

不幸的是,将UserInfoView类型的视图添加到故事板场景中并不会神奇地从NIB文件示例化该对象。
您要么需要将控件直接移动到情节串连图板场景中并将它们链接到那里,要么需要从NIB文件示例化视图并将其添加到视图控制器的视图代码中;
您正在尝试使用loadNibNamed的第二种方法。您的错误是提供self作为owner参数。此参数是指定为“Files owner”的对象,因此您需要提供UserInfoView的示例:

let fileOwner = UserInfoView(frame:CGRect.zero)
if let view = Bundle.main.loadNibNamed("UserInfoView", owner: fileOwner, options: nil)?[0] as UserInfoView {
...
}

相关问题