似乎不可能使用界面生成器创建的.xib创建嵌套的自定义子视图.例如,我想创建一个自定义BarView,并在其中嵌套一个自定义FooView,其中每个视图的内容在IB中创建并存储在

enter image description here

BarView从其.xib文件加载,并作为ViewControllerviewDidLoad()方法中的子视图添加:

class ViewController: UIViewController {
    var barView : BarView?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.barView = 
          (UINib(nibName: "BarView", bundle:Bundle.main).
             instantiate(withOwner: nil, options: nil).first as? BarView)
        self.view.addSubview(self.barView!)
    }
}

我可以为IB创建的UIButton个插座创建和连接:

class BarView: UIView {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        NSLog("BarView init:NSCoder, barButton set: \(barButton != nil)")
    }

    public override func awakeFromNib() {
        super.awakeFromNib()
        NSLog("BarView: awakeFromNib(), barButton set: \(barButton != nil)")
    }

    @IBOutlet weak var barButton: UIButton!    
}

我还可以将插座和动作连接到nest FooView:

class FooView: UIView {

   required init?(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
       NSLog("FooView init:NSCoder, fooButton set: \(fooButton != nil)")
   }

    public override func awakeFromNib() {
        super.awakeFromNib()
        NSLog("FooView: awakeFromNib(), fooButton set: \(fooButton != nil)")
    }

    @IBAction func doFoo(_ sender: Any) {
        NSLog("doFoo")
    }

    @IBOutlet weak var fooButton: UIButton!
}

我可以看到init?(NSCoder)awakeFromNib()方法确实被调用了.我不知道为什么调用BarView的方法

... BarView  init:NSCoder, barButton set: false
... BarView: awakeFromNib(), barButton set: false
... FooView init:NSCoder, fooButton set: false
... BarView init:NSCoder, barButton set: false
... BarView: awakeFromNib(), barButton set: true
... FooView: awakeFromNib(), fooButton set: false

FooView(即fooButton)的内容不显示,在FooView个回调中为nil.是否支持使用独立的.xib文件创建嵌套自定义视图?如果是这样,实现这一点的诀窍是什么?

各种建议in this post不太正确或不起作用.

推荐答案

似乎不可能使用界面生成器创建的.xib创建嵌套的自定义子视图.

记住,你在这里逆流而上;故事板的引入正是为了摆脱大量单独的.xib文件.

我能看到init?(NSCoder)和awakeFromNib()方法确实正在被调用.我不知道为什么BarView的方法被调用了两次

它们被调用了两次,因为您正在创建两个实例.一个在Main.storyboard,另一个在BarView.xib.

FooView的内容(即fooButton)不会显示,并且在FooView的两个回调中都为零

这听起来像是另一个身份错误的 case ,类似于上面的问题.BarView.xib中有一个Foo的例子,与FooView.xib中的不同.

是否支持使用独立的.xib文件创建嵌套自定义视图?如果是这样,实现这一点的诀窍是什么?

据我记忆所及,不是直接的.当然,您可以从.xib文件加载视图,并将其添加到视图图中.您甚至可以创建一个UIView子类,其任务是在指定的.xib中加载视图,并将其设置为自己的子视图.您需要注意的一件事是.xib文件中的File's Owner代理对象;一定要了解如何使用它将.xib文件中的对象连接到文件所有者中的出口.

Ios相关问答推荐

将图案UI视图动画化以模拟进度条

Firebase SDK 10+—无法安装软件包

不使用iOS 17修改器修改SWIFT用户界面视图

删除领域中的cartItem时出现问题

如何将Safari调试器附加到Turbo-iOS原生应用中的模拟器

在SwiftUI中插入绘制重复形状

如何在SwiftUI中为带有CornerRadius的矩形创建下边框?

如何在SwiftUI中将图像整合到文本标签中间?

无法在 CollectionView 中禁用部分弹跳 - 组合布局

如何从 Locale Swift 获取货币符号

为 ColorPicker 创建一个名为 Color 的计算变量的绑定

Swiftui为什么在点击第二行之前背景不起作用

一个 SwiftUI 视图中的多个垂直滚动视图

在向我的 struct 添加属性后获取线程 10:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

辅助功能判断器无法在 macOS Monterey 版本 12.3 上的 Xcode 版本 13.3 上运行

UIButton在iOS7中没有显示突出显示

使用导航控制器在prepareForSegue中设置数据

将 struct 保存到 UserDefaults

类 AMSupportURLConnectionDelegate 在两者中都实现

为什么我需要@1x、@2x 和@3x iOS 图像?