Creating VC by using .XIB

創(chuàng)建Xib前的準(zhǔn)備

  • 仍然使用single view 單例模式創(chuàng)建
  • 不去刪除原生的Main.storyboard
    • 這樣做可以省去在Appdelegate中的 didFinishLaunch去設(shè)置self.window.view及設(shè)定rootviewController
  • 這種的方式。VC的入口仍然是Main.storyboard及其對(duì)應(yīng)的 ViewController.m

創(chuàng)建Xib

  • 下面著重講一下之前的一個(gè)認(rèn)知誤區(qū):即 一個(gè)XIB ≠ 一個(gè)ViewController
  • 有兩個(gè)函數(shù)可以載入XIB上的內(nèi)容
    • initWithNib
      self.vc = [[ViewController alloc] initWithNibName:@"ViewController"
      bundle:nil];
    • loadNibNamed: owner: options:
      self.view = [[NSBundle mainBundle] loadNibNamed:@"SpecialThird"
      owner:self
      options:nil].lastObject;
  • 下面著重來介紹下這兩種方式究履。

XIB作為ViewContrller的對(duì)應(yīng)UI使用

使用initWithNib

  1. 有一個(gè)大前提,如上面創(chuàng)建Xib前的準(zhǔn)備 所述最仑,通過單例創(chuàng)建且不刪除main.storyboard
  2. 通過cmd+n 新建一個(gè)ViewController的子類DIYViewController,創(chuàng)建時(shí)盯仪,有一個(gè)Also Create XIB file
  3. 創(chuàng)建之后,可以在這個(gè)ViewController上拖曳/添加控件蜜葱,這些都與storyboard一樣全景,沒有差異。再次不贅述牵囤,注意下面這張圖即可
Paste_Image.png

XIB 作為自定義的View使用 __ 重點(diǎn) __

使用loadNibNamed: owner: options:

  1. 此時(shí)的XIB相當(dāng)于我們的一個(gè)自定義UIView
  2. 先通過cmd+n 去interface里面創(chuàng)建一個(gè)empty的XIB(和上面不同爸黄,上面是通過隊(duì)要你管的VC類創(chuàng)建XIB揭鳞,這里是直接先創(chuàng)建XIB)
  3. 此時(shí)XIB里沒有UI界面,從控件中拖取一個(gè)UIView進(jìn)來
  4. 創(chuàng)建一個(gè)DIYView繼承UIView
  5. 指明第三步創(chuàng)建的UIView的類為DIYView野崇,并在上面添加控件,如下圖,及對(duì)應(yīng)的實(shí)現(xiàn)代碼
    注意圖中的說明鳖轰。class的類為NSObject何上面的自定義vc不同!
  6. NSBundle會(huì)動(dòng)態(tài)實(shí)現(xiàn)蕴侣,也就是說一旦在viewdidload中創(chuàng)建,就會(huì)立即出現(xiàn)
Paste_Image.png
//  SpecialView.m
//  ForTestingXIB
#import "SpecialView.h"
@interface SpecialView()
@property (weak, nonatomic) IBOutlet UILabel *ShowLabel;

@end

@implementation SpecialView
- (IBAction)changeLabel:(UIButton *)sender {
    self.ShowLabel.text = @"Now changed";
}

下面是如何在main.storyboard 對(duì)應(yīng)的 ViewController中插入

  • 代碼中包括了上面的兩種方法
  • 重點(diǎn)說一下loadNibNamed這個(gè)函數(shù)辱志。
    • 這個(gè)函數(shù)的返回值是一個(gè)由UIView(或其子類)組成的 NSArray如下
      NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"SpecialThird"
                                                 owner:self
                                               options:nil];
      NSLog(@"數(shù)組長度 = %lu",array.count);
      NSLog(@"數(shù)組[0] = %@",array[0]);
    
    • 打印出的數(shù)組日志為

2015-12-29 16:13:34.044 ForTestingXIB[11606:743852] 數(shù)組長度 = 1 2015-12-29 16:13:34.045 ForTestingXIB[11606:743852] 數(shù)組[0] = <SpecialView: 0x7fb99951d920; frame = (0 0; 600 600); autoresize = RM+BM; layer = <CALayer: 0x7fb99951aa10>>

  • 數(shù)組中只有一個(gè)元素狞膘,通過獲取他可以獲取控件
#import "ViewController.h"
#import "SecViewController.h"
#import "SpecialView.h"
#import "Masonry.h"
@interface ViewController ()
@property (strong,nonatomic) SecViewController *vc;
@property (strong,nonatomic) SpecialView *view3;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.vc = [[SecViewController alloc] initWithNibName:@"SecViewController" bundle:nil];
    
    SpecialView *view = [[NSBundle mainBundle] loadNibNamed:@"SpecialThird"
                                                      owner:self
                                                    options:nil].lastObject;
    [self.view insertSubview:view
                     atIndex:1];
    self.view3 = view;
}

關(guān)于Load創(chuàng)建辦法的幾點(diǎn)補(bǔ)充

我在寫應(yīng)用實(shí)例demo的時(shí)候,發(fā)現(xiàn)一個(gè)問題客冈。
如果沒有按照上述的順序去創(chuàng)建:

  1. 先通過創(chuàng)建類的同時(shí)創(chuàng)建XIB
  2. 將這個(gè)XIB中的UIView替換成自定義的DIYView
    a.如果不替換而在上面添加控件,編譯可以通過但程序會(huì)崩潰
    采用上述兩點(diǎn)操作的話场仲,一旦在ViewDidLoad中賦值,運(yùn)行的時(shí)候就會(huì)立即顯示load創(chuàng)建的XIB中的View
    self.view3 = [[NSBundle mainBundle] loadNibNamed:@"ThirdVC"
    owner:self
    options:nil].lastObject;

其中的原因:

如下圖所示渠缕,通過ViewController創(chuàng)建的XIB中默認(rèn)會(huì)關(guān)聯(lián)這個(gè)Outlet,所以在我們用load創(chuàng)建的時(shí)候會(huì)立刻載入這個(gè)View.而正常按步驟創(chuàng)建的話是沒有這個(gè)Outlet的亦鳞,如下圖3

Paste_Image.png

圖1!

Paste_Image.png

圖2

Paste_Image.png

圖3

TBD 問題!

上面用到了insert view之后遭笋,顯示出來的圖形變成了疊加,是為何

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓦呼,一起剝皮案震驚了整個(gè)濱河市测暗,隨后出現(xiàn)的幾起案子央串,更是在濱河造成了極大的恐慌碗啄,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚字,死亡現(xiàn)場離奇詭異厦酬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弃锐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門殿托,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剧蚣,你說我怎么就攤上這事○矗” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵馒吴,是天一觀的道長。 經(jīng)常有香客問我饮戳,道長,這世上最難降的妖魔是什么洞拨? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮烦衣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘花吟。我一直安慰自己,他們只是感情好衅澈,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矾麻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪险耀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天甩牺,我揣著相機(jī)與錄音,去河邊找鬼。 笑死澎媒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戒努。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼储玫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了萤皂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤端礼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后入录,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喻括,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唬血。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拷恨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腕侄,到底是詐尸還是另有隱情,我是刑警寧澤冕杠,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站分预,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏薪捍。R本人自食惡果不足惜配喳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一凳干、第九天 我趴在偏房一處隱蔽的房頂上張望晴裹。 院中可真熱鬧救赐,春花似錦涧团、人聲如沸经磅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畏陕。三九已至配乓,卻和暖如春惠毁,著一層夾襖步出監(jiān)牢的瞬間犹芹,已是汗流浹背鞠绰。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來泰國打工腰埂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜈膨,地道東北人屿笼。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓翁巍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灶壶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肝断,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 引言 本來“一天一點(diǎn)xib”系列就九篇文章恰响,但在留言中有一個(gè)朋友提出了兩點(diǎn)疑問: 1.為什么獲得重用cell的時(shí)候...
    二亮子閱讀 11,822評(píng)論 24 102
  • 首先聲明,我這是根據(jù)別人的講解來寫出來的渔隶,洁奈,, 一利术、關(guān)于xib 1.xib和nib 在程序里面我們看到的基本上是U...
    湮滅_塵事閱讀 3,593評(píng)論 1 14
  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,407評(píng)論 2 4
  • iOS開發(fā)的這些年里低矮,有的人用代碼創(chuàng)建UI印叁,有的人用xib創(chuàng)建UI军掂。到底是用xib還是代碼來創(chuàng)建UI,這個(gè)問題以前...
    Tank丶Farmer閱讀 3,858評(píng)論 0 3
  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多轮蜕,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1蝗锥,想要解決就用__block...
    炙冰閱讀 2,494評(píng)論 1 14