iOS视图上的自定义子视图具有空出口

时间:2014-02-08 21:40:49

标签: ios objective-c ios7 xib subview

我有一个名为FeedView的视图,由FeedViewController处理。

我还有一个名为“NearestStore”的XIB,它由一个名为“NearestStoreViewController”的视图控制器处理。 NearestStore xib有标签,按钮等。在视图控制器中,我有连接到NearestStore.xib中子视图的插座。

NearestStore继承自UIButton(因此处理点击事件更容易)。

在FeedViewController.xib上我有一个UIButton,它已被设置为NearestStore类型。

到目前为止一切顺利。这是在我的FeedViewController上:

__weak IBOutlet NearestStoreButton *btn_nearestStore;

插座在xib上连接到插座。

NearestStoreViewController有几个子视图出口,如:

@property (nonatomic, weak) IBOutlet  UILabel *lbl_distance; 
@property (nonatomic, weak) IBOutlet  UIImageView *img_distance;

出于某种原因,在我的FeedViewController上,对btn_nearestStore的引用很好,但所有子视图都是nil。

例如:

btn_nearestStore.lbl_distance 

是零

我错过了什么?

4 个答案:

答案 0 :(得分:3)

这听起来就像系统应该工作一样。使用xibs创建自定义小部件并不容易。

以下是它的工作原理:

您的FeedViewController将为相应的FeedView执行xib加载。 在此加载过程中,它会注意到NearestStoreButton子视图。因此,它使用NearestStoreButton类上的- (id)initWithCoder:消息创建了这样的视图。它不会神奇地注意到相应的.xib和相应的viewController。

如果需要在xib中使用xib,则需要手动为所有子视图加载。请记住,您需要为这些辅助xib创建/使用适当的所有者(视图控制器)。

答案 1 :(得分:0)

很难从您的描述中看出来,但这听起来像是加载的NearestStoreButton XIB的“所有者”的问题。加载NIB时,您将为加载程序提供一个所有者,并为其所有者提供大多数出口绑定和操作。如果您使用NearestStoreButton加载UINib,那么当您致电instantiateWithOwner:options:时,请确保将通行证应设置为所有者的对象。

答案 2 :(得分:0)

你什么时候打电话给插座?如果您尝试在视图的initWithCoder方法中访问该属性,则无法保证该对象已实例化。

如果您在视图中使用awakeFromNib方法访问您的媒体资源,那么您应该可以获得它。例如,我有一个自定义视图,我的代码看起来像这样:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        //Don't style the subviews in here since they won't be initialized
    }
    return self;
}

- (void)awakeFromNib
{
    [super awakeFromNib];
    [self styleViews];
}

- (void)styleViews
{
     //access my properties and style them in here
}

答案 3 :(得分:0)

以下帖子包含有关使用Nib创建自定义视图的详细说明:

creating custom view using Nib

在我创建帖子中提到的customInit之后,我能够分配IBOutlets。