利用来自外部加载的 Nib 的 IBOutlets/IBActions

Posted

技术标签:

【中文标题】利用来自外部加载的 Nib 的 IBOutlets/IBActions【英文标题】:Utilizing IBOutlets/IBActions from external loaded Nib 【发布时间】:2016-07-19 16:24:53 【问题描述】:

请原谅我的菜鸟问题,但我真的需要一些帮助。我正在用swift2学习ios开发。不幸的是,在使用 Views/Nib 文件时,我遵循/完成的教程并没有真正涉及到很多高级内容。

无论如何,我正在尝试创建一个自定义类来加载我的 Nib,并且我可以使用新实例化的 UIView 类型类的 Outlets/Actions。

我能够找到一些信息,使我能够正确加载我的视图并将其插入到我的 tableHeaderView 中,但我有点迷失了。我需要一点指导。

ReserveHeaderCell.swift

class ReserveHeaderCell : UIView


    @IBOutlet weak var ReserveHeaderImageView: UIImageView!


    class func instanceFromNib() -> UIView 
        return UINib(nibName: "ReserveHeaderCell", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! ReserveHeaderCell
    


我将我的 xib 中的类设置为此类,此外,出口指的是父视图中的 UIImageView。

ReserveViewController.swift 包含:

let reserveHeaderFrame: CGRect = CGRectMake(0,0,self.view.frame.size.width, 164)
let rhCell = ReserveHeaderCell.instanceFromNib()
rhCell.frame = reserveHeaderFrame
ReserveTableView.tableHeaderView = rhCell

这一切都有效。框架被创建,xib 被加载并添加到视图中。太好了,问题是,我无法访问 ReserveHeaderCell.swift 文件中定义的 IBOutlets。另外,我真的不知道这是否是完成我想做的事情的正确方法。

我想要完成的事情(使用 obj-C 完成)

- (id)initWithFrame:(CGRect)frame 
    if (self) 
        NSArray *nib = [[NSBundle mainBundle]
                        loadNibNamed:@"HeaderNib"
                        owner:self
                        options:nil];

        self = [nib objectAtIndex:0];
        // ACTIONS GO HERE

    
    return self;

这样我就可以访问任何创建的 IBOutlets(在 obj-c 中是 H 文件,但对于我来说,它应该是类,对吧?)

使用 obj-c 方法,我可以简单地调用 view.outlet = "" 并访问它们。

感谢任何帮助。感谢任何可以提供帮助的教程链接。

提前谢谢你。

【问题讨论】:

【参考方案1】:

您可以使用此代码来初始化您的 nib 文件

let view = (NSBundle.mainBundle().loadNibNamed("MenuHeader", owner: self, options: nil)[0] as? UIView)
tableView.tableHeaderView = view

然后您的 MenuHeader 将是一个普通的 .xib 文件,其中包含您的单元格,只需记住适当地调整约束以适应您想要的所有屏幕。如果您的 UIView 已经有一个类,则必须将您的 nib 文件与此类连接,然后您可以使用“view.label.text”,然后更改您的值。请记住保留此视图的引用,或者在您必须更改标题信息时创建一个新视图。如果你想跟踪一个动作,最好的方法是通过委托方法或使用 NSNotificationCenter。

【讨论】:

不过,我想使用自定义类来加载它。不仅仅是直接将其加载到 tableview 中。这样做的原因是因为某些 xib 会有很多输入/输出。对于特定的笔尖它可能没问题,但是当以类似的方式实现其他具有更详细的布局/输出/动作的其他解决方案时,此解决方案将有所帮助。 抱歉,您几乎就在这里。一个例外是我需要将其从 as! UIView 为!我的自定义类。另外,我将其更改为 UINib() 函数。但这给了我大致的方向。谢谢

以上是关于利用来自外部加载的 Nib 的 IBOutlets/IBActions的主要内容,如果未能解决你的问题,请参考以下文章

readFromData:ofType:error: 在加载 nib 之前调用所以我不能使用我的 IBOutlets D:<

UITextField floatValue 加载 Nib

使用 NSViewController 加载 nib 后...如何访问 nib 中的 NSButton?

当在 nib 中声明 UITableView 时,UITableViewCell nil IBOutlets [重复]

以编程方式加载 nib2 时,来自 nib1 的 awakeFromNib 被调用

从外部引用设置属性上的 .attributedText(可通过 NIB 加载的 UIView 内的插座访问)似乎失败