【问题标题】:View placeholders replacement with xib using the awakeAfterUsingCoder method使用 awakeAfterUsingCoder 方法将占位符替换为 xib
【发布时间】:2013-10-26 13:23:24
【问题描述】:

我目前正在开发一个 iOS 应用程序,该应用程序具有多个包含 UIView 子类的 xib,该子类充当屏幕标题的占位符。 当视图控制器从它们的 nib 加载时,它们会实例化 HeaderView 占位符。在 HeaderView 类中,我有一个用真实视图替换占位符视图的方法,代码如下:

- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
    if (![[self subviews] count])
    {
        if (headerViewNib == nil)
            headerViewNib = [UINib frameworkNibWithNibName: @"HeaderView"];

        HeaderView * headerView = [[headerViewNib instantiateWithOwner: controller options: nil] lastObject];

        [headerView setTranslatesAutoresizingMaskIntoConstraints: NO];

        return headerView;
    }
    return self;
}

到目前为止,一切正常。但是现在我需要在标题中添加一个类似于弹出框的菜单。所以我向 HeaderView xib 添加了一个 UIButton,正如预期的那样,它显示在所有视图控制器中,但现在我需要管理对该按钮的触摸。 我在我的基本 UIViewController 类中添加了一个“- (IBAction)showHeaderMenu”方法,并在 HeaderView.xib 中将文件的所有者配置为此类,因此我可以将按钮触摸操作连接到 showHeaderMenu 操作。 问题是我将“控制器”作为所有者传递给 instantiateWithOwner:options: 方法。但是这个控制器是零。所以我在菜单按钮上的触摸事件没有得到处理。

所以现在我正在寻找一种方法来正确设置“控制器”属性。目前在我所有的视图控制器 xib 中,我将占位符 headerview“控制器”出口连接到文件的所有者(即控制器),但它似乎不起作用。

如果您有不同的模式要建议,这不会迫使我放弃我的 HeaderView.xib 或占位符视图,我愿意 :)

【问题讨论】:

    标签: ios iphone objective-c uiview interface-builder


    【解决方案1】:

    我不确定我是否完全了解您的问题,但如果它与您无法通过 IB 设置 IBAction 相关,因为未加载某些内容,或者您​​始终可以通过代码设置 IBAction 事件侦听器。

    UIButton *yourButton = [[UIButton alloc] init];
    [yourButton addTarget:self action:@selector(myMethod:) forControlEvents:UIControlEventTouchUpInside]
    

    【讨论】:

    • 是的,它可以是一种选择,即使我想避免添加代码以将一个按钮连接到其操作方法,而 IB 正在为我的所有其他控件执行此操作。此外,目前目标似乎已连接,因为我在触摸按钮时收到“发送到已释放实例的消息”崩溃,但我不知道它连接到什么 :)
    • 实际上我不明白为什么连接到文件所有者(控制器)的占位符标题的出口没有从笔尖解码。我查看了 .xib 源代码,它的连接方式类似于“”,我看到相同的 XML集合视图委托/数据源、搜索栏委托等...并且这些链接已正确解码。
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2013-01-24
    • 2017-07-29
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多