如何在 Objective-C 控制器中以编程方式加载用 swift 编写的自定义 XIB 视图

Posted

技术标签:

【中文标题】如何在 Objective-C 控制器中以编程方式加载用 swift 编写的自定义 XIB 视图【英文标题】:How to load a custom XIB view written in swift programatically in an Objective-C Controller 【发布时间】:2020-12-16 04:19:30 【问题描述】:

我为 UIView 创建了一个名为 popUpView.xib 的 XIB 和一个与之关联的 swift 文件 popUpView.swift

我的 popUpView.swift 代码是这样的:

@objc class popUpView: UIView 

    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var mobileNumberTF: UITextField!
    @IBOutlet weak var customerIdTF: UITextField!
    @IBOutlet weak var panNumberTF: UITextField!
    @IBOutlet weak var cancelBtn: UIButton!
    @IBOutlet weak var saveBtn: UIButton!
    
    override init(frame: CGRect) 
        super.init(frame: frame)
        self.initSubViews()
            
    
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.initSubViews()
    
    
    func initSubViews() 
        
        let name = String(describing: type(of: self))
        let nib = UINib(nibName: name, bundle: .main)
        nib.instantiate(withOwner: self, options: nil)
        
        self.addSubview(self.containerView)
        self.containerView.translatesAutoresizingMaskIntoConstraints = false
        self.addConstraints()
    
    
    func addConstraints() 
        NSLayoutConstraint.activate([
            self.topAnchor.constraint(equalTo: containerView.topAnchor),
            self.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
            self.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
            self.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
        ])
    

现在我正在尝试在我用 Objective-C 编写的 ViewController 中将此视图作为弹出窗口加载

在我的 ViewController 中,我是这样调用的:

-(void)showPopUpView 
    
         popUpView *popUpView = [[popUpView alloc] initWithFrame:CGRectZero];
        [self.view addSubview:popUpView];
        [popUpView.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:25].active = YES;
        [popUpView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:25].active = YES;
        [popUpView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:25].active = YES;
        [popUpView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:25].active = YES;    

在 viewDidLoad 中

- (void)viewDidLoad 
    [super viewDidLoad];
    [self showPopUpView];


I think I might be doing it the wrong way. What is the right way to load this custom view programatically in Obj-C?

【问题讨论】:

我认为您缺少 ViewController 中弹出视图的约束。究竟是什么问题? @Arun 我已经添加了约束,仍然没有显示视图。我从 viewDidLoad() 方法调用它。 可能为弹出视图添加 translatesAutoresizingMaskIntoConstraints = false 这将有助于***.com/questions/863321/… @Arun 我无法以编程方式加载视图。但是现在,当我在 myViewController XIB 中查看视图并将视图类作为 popUPView 后,我就可以显示了。这实际上不是我想要的,但它现在工作正常.. 无论如何感谢您的帮助。 【参考方案1】:

自从我上次这样做以来我就很好奇,所以我创建了一个项目来测试它。这就是它对我的工作方式。

我的 xib:

我的 PopupView.m

我的 ViewController.m

将代码添加到此 GitHub 存储库: https://github.com/ArunEA/ObjcViewWithNib

【讨论】:

以上是关于如何在 Objective-C 控制器中以编程方式加载用 swift 编写的自定义 XIB 视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中以编程方式检查协议是不是包含某些方法?

如何在 Swift 中以编程方式创建 SplitViewController?

如何在Objective-C中以编程方式发送带有一些正文文本的短信[重复]

如何在 Objective-C 中以编程方式添加特定大小的 UIImageView。我也有同一个类的 xib 文件,但我不想使用它

在 Objective-C Xcode 5 中以编程方式创建视图

基于coreData信息在objective-c中以编程方式创建图像