美文网首页MarkDIAMONDiOS StoryBoard + xib
【iOS】关于xib初始化的一些事儿

【iOS】关于xib初始化的一些事儿

作者: 刘大帅 | 来源:发表于2015-04-22 16:50 被阅读8791次

    参考文章

    1、- awakeFromNib

    awakeFromNib

    它是NSObject类目里提供的一个方法,根据类目名,我们也能见名思意的知道,它是用于Interface Builder的,也就是给xib文件和storyboard(storyboard在打包时会拆解成它包含的xib文件,接下来就不特意提及storyboard了)的。

    它的原理是,当xib文件加载完的时候,会发送一个awakeFromNib的消息到xib文件中的每个对象,每个对象都可以重写自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。比如storyboard上的一个scene,也就是一个xib,它加载完成时,会给它上面的每个对象发一条消息。

    它是基类的扩展方法,这就为我们用代码更细腻的操作xib创造了可能。在xib文件的Indentity inspector中,将xib文件上的对象与类绑定。然后在.m文件中重写- awakeFromNib即可。

    以下是我把storyboard中的navigation item 与我自己定制的继承于UINavigationItem的类绑定后的代码片段

      
    -(void)awakeFromNib
    {
        //说明文档里说必须调用父类的awakeFromNib,以防出现意外,详细说明见文档
        [super awakeFromNib];
        
        self.searchItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"m_search23"] style: UIBarButtonItemStylePlain target:self action:@selector(searchAction)];
        self.leftBarButtonItem =_searchItem;
    }    
    
    

    此方法的调用时机在-initWithCoder:之后(根据它的实现机制,这并不意外)。

    2、-(id)initWithCoder:(NSCoder *)aDecoder

    只要遵从了NSCoding协议的类都有-initWithCoder:这个方法。xib文件的类常常会用到这个方法,我猜是因为xib文件编码解码用了-initWithCoder:和-encodeWithCoder:,所以如果我们重写-initWithCoder:,就可以对xib文件的初始化作代码上的调整。

    它的机制是用从unarchiver得到的数据初始化一个对象。

    上面的功能也可以这样实现:

    
    -(id)initWithCoder:(NSCoder *)aDecoder
    {
        self = [super initWithCoder:aDecoder];
        
        self.searchItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"m_search23"] style: UIBarButtonItemStylePlain target:self action:@selector(searchAction)];
        
        self.leftBarButtonItem =_searchItem;
        
        return self;
    }  
    

    此方法的调用时机在- awakeFromNib之前(这也是当然的)。

    3、- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options

    我们加载xib文件要用到的一个方法。
    目前没遇到什么特别的疑惑,举个我用过的例子吧:

    
    
    -(id)initWithBridge:(HeaderAndTableBridge*)bridge
    {
        //这里不再是 self = [super init]...
        self = [[[NSBundle mainBundle]loadNibNamed:@"HeaderViewForTable" owner:self options:nil]objectAtIndex:0];
        self.shareBtn.layer.cornerRadius = CGRectGetHeight(self.shareBtn.frame)/15.0;
        self.hl_bridge = [[HeaderAndListBridge alloc]init];
        
        NetworkService* service = [[NetworkService alloc]init];
        [service getDataWithType:NetworkCategory token:[NSString getToken] timeStamp:[NSString getTimeStamp] data:nil success:^(RetData *retData) {
            self.hl_bridge.listArray = [retData.ret_msg objectForKey:@"data"];
        } failure:^(NSError *error) {
            NSLog(@"分类 error =%@",error);
        }];
        
        self.ht_bridge = bridge;
        
        return self;
    }  
    

    4、-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    这个是视图控制器加载并初始化bundle里的xib文件的方法。这个方法应该不常用,原因很简单,你一般不会把一个视图控制器做成xib的。如图,苹果也没有直接提供视图控制器的xib:

    选择User Interface

    相关文章

      网友评论

      • e1004ef1c03c:-(id)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle )nibBundleOrNil;更多应该是之前为了一个Controller对象初始化时,指定iPhone或者iPad的xib不同布局用的

      本文标题:【iOS】关于xib初始化的一些事儿

      本文链接:https://www.haomeiwen.com/subject/ziiufttx.html