You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何通过代码创建自定义Xib UIView并在HomeVC调用

纯代码调用Xib自定义UIView的正确实现

原代码存在的问题

  1. 自定义视图的Xib加载逻辑错误:commonInit方法中,加载Xib视图后又重新实例化了ReusableContainerview,覆盖了原本的Xib视图,不仅无法正确显示Xib内容,还可能引发循环创建问题。
  2. 控制器调用逻辑缺失:HomeVC仅声明了可选变量reuseView,未初始化视图,也未将其添加到控制器的视图层级中,自然无法显示。

修正后的自定义UIView代码

import UIKit
class ReusableContainerview: UIView {

    @IBOutlet weak var containerView: UIView!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    
    private func commonInit(){
        // 安全加载Xib文件
        let nib = UINib(nibName: "ReusableContainerview", bundle: nil)
        guard let viewFromXib = nib.instantiate(withOwner: self, options: nil).first as? UIView else {
            return
        }
        // 设置Xib视图跟随父视图自动调整大小
        viewFromXib.frame = bounds
        viewFromXib.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(viewFromXib)
    }
}

控制器中纯代码调用的正确方式

方式1:使用Frame布局

import UIKit

class HomeVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 初始化自定义视图并设置位置大小
        let reuseView = ReusableContainerview(frame: CGRect(x: 0, y: 100, width: view.bounds.width * 0.9, height: 300))
        // 水平居中
        reuseView.center.x = view.center.x
        // 将视图添加到控制器视图层级
        view.addSubview(reuseView)
    }
}

方式2:使用AutoLayout约束(推荐)

import UIKit

class HomeVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let reuseView = ReusableContainerview()
        // 关闭自动转换约束,启用手动AutoLayout
        reuseView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(reuseView)
        
        // 设置约束
        NSLayoutConstraint.activate([
            reuseView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            reuseView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
            reuseView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.9),
            reuseView.heightAnchor.constraint(equalToConstant: 300)
        ])
    }
}

内容的提问来源于stack exchange,提问作者Swift

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:36:13