使用awakeAfterUsingCoder方法查看使用xib替换占位符

时间:2013-10-26 13:23:24

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

我目前正在开发一个iOS应用程序,它有多个包含UIView子类的xib,它充当屏幕标题的占位符。 从视图控制器加载视图控制器时,它们会实例化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;
}

到目前为止,一切正常。但是现在我需要在标题中添加一个类似于popover的菜单。所以我在HeaderView xib中添加了一个UIButton,正如预期的那样在所有视图控制器中显示,但现在我需要管理该按钮上的触摸。 我添加了一个" - (IBAction)showHeaderMenu"我的基础UIViewController类的方法,我在HeaderView.xib中配置文件的所有者到这个类,所以我可以将按钮触摸动作连接到showHeaderMenu动作。 问题是我正在通过"控制器"作为instantiateWithOwner:options:方法的所有者。但是这个控制器是零。因此,我的菜单按钮上的触摸事件无法处理。

所以现在我正在寻找一种方法来获得"控制器"属性设置正确。在我所有的视图控制器xib中,我连接了占位符headerview" controller"文件所有者(控制器)的出口,但它似乎没有工作。

如果你有一个不同的模式建议,这不会强迫我放弃我的HeaderView.xib或占位符视图,我打开:)

1 个答案:

答案 0 :(得分:1)

我不确定我是否确切地解决了您的问题,但是如果它与您无法通过IB设置IBAction有关,因为没有加载某些东西或者您总是可以通过代码设置IBAction事件监听器。

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