MacOS-MacAPP使用Main.storyboard启动视图程序踩坑
由于主做移動(dòng)端APP的iOS開發(fā),對(duì)于Mac端的APP開發(fā)較少,我也本以為,簡(jiǎn)單的以為會(huì)和iOS差不多
雄赳赳,氣昂昂
沒想到啊,真是沒想到啊,帥不過3秒!!!尷尬!!!
在程序視圖啟動(dòng)入口處就掛了,踩了一些坑,創(chuàng)建macOS項(xiàng)目步驟我就不再介紹了,可參考博文
本人使用OC創(chuàng)建的macOS項(xiàng)目,勾選了storyboard,創(chuàng)建好項(xiàng)目之后,界面如下:
在可視化編輯器中看到的東西。有三個(gè)主要區(qū)域,每個(gè)在 Document Outline 中也有相應(yīng)的文本表示:
- Application Scene:菜單欄和項(xiàng)目。
- Window Controller Scene:配置窗口行為。
- View Controller Scene:UI 元素所在的地方
?
一、坑一:刪除ViewController自定義Controller,運(yùn)行APP還是空白window
默認(rèn)有ViewController.h和ViewController.m以及Main.storyboard文件,看storyboard視圖區(qū)域會(huì)發(fā)現(xiàn)程序入口AppDelegate默認(rèn)指向WindowController,WindowController指向ViewController,最終展示的是ViewController上的視圖,可參考看上圖,也可通過運(yùn)行APP查看圖層也可驗(yàn)證
博主習(xí)慣性的刪除了ViewController文件,然后自己創(chuàng)建了自定義MainViewController,并在上面添加了一些UI,發(fā)現(xiàn)啟動(dòng)APP還是展示以前的空白window,雖然刪除了ViewController文件,但其實(shí)指向還是指向ViewController,因此我們需要改變指向,如下:
通過最右邊的inspector面板區(qū)域Identity選項(xiàng);Identity: 如果控件使用自定義的類,需要從Class下拉列表中選擇
選中自定義的MainViewController,這時(shí)Main.storyboard的UI就和controller關(guān)聯(lián)起來了,在運(yùn)行就是展示MainViewController上的視圖
?
二、坑二:Main.storyboard中Window關(guān)聯(lián)不了AppDelegate
我想在AppDelegate中關(guān)聯(lián)上Main.storyboard中的主Window,發(fā)現(xiàn)怎么都關(guān)聯(lián)不上,查看storyboard區(qū)域視圖發(fā)現(xiàn)其window指向WindowController的
指向也可看出其關(guān)聯(lián)類
?
三、坑三:刪除Main.storyboard,使用自定義創(chuàng)建的XIB文件
刪除了Main.storyboard文件之后,運(yùn)行直接報(bào)錯(cuò)'Could not find a storyboard named 'Main' in bundle NSBundle;只好將其還原回去
?
因?yàn)樵陧?xiàng)目中指定了?程序啟動(dòng)視圖主界面為Main.storyboard;我們可以自定義一個(gè)MainMenu.xib文件,在General----Deployment Info----Main Interface,指定MainMenu.xib;這時(shí)在運(yùn)行就會(huì)發(fā)現(xiàn)程序啟動(dòng)主界面就是MainMenu.xib上的UI
這個(gè)時(shí)候我們就可以將Window關(guān)聯(lián)上AppDelegate了;其界面和Main.storyboard相比就沒那么豐富了,就單純的查看自己界面屬性
這個(gè)時(shí)候不管我們使用Main.storyboard還是自定義的MainMenu.xib文件加載主界面都是可以的
通過Main.storyboard初始化界面,加載主界面
通過自定義MainMenu.xib文件初始化界面,加載主界面
?
綜上,也總結(jié)了一下MacOS開發(fā)和iOS開發(fā)的一些區(qū)別:
具體區(qū)別也可參考博文MacOS-MAC 開發(fā)和IOS開發(fā)不同之處(純代碼)
MacOS開發(fā)常用的控制器為NSWindowController,而不是iOS里面的ViewController,因?yàn)閙ac app大多數(shù)為多窗口,而iOS app上只有一個(gè)主窗口,更多數(shù)的情況下我們是在ViewController做操作,顯示各個(gè)不同的頁面,而且UI控件大部分以UI開頭,而MacOS開發(fā)剛好相反,UI控件基本上Main.storyboard是以NS開頭,每個(gè)NSWindowController 的xib都包含一個(gè)NSWindow和一個(gè)NSView。
由于MacOS開發(fā)學(xué)習(xí)資料較少,目前就在網(wǎng)上下載的很多demo來看,發(fā)現(xiàn)大部分都用的是xib,使用storyboard的都比較少,除了少部分的純代碼手寫除外!
MacOS開發(fā)的坐標(biāo)系也與iOS開發(fā)的坐標(biāo)系不同,MacOS開發(fā)的坐標(biāo)系的原點(diǎn)在XY坐標(biāo)系的左下角,而iOS開發(fā)的坐標(biāo)系的原點(diǎn)是在XY坐標(biāo)系的左上角開始的。當(dāng)然了,你要是不習(xí)慣的話可以強(qiáng)制性修改它的坐標(biāo)系,如:通過覆蓋視圖的isFlipped方法,強(qiáng)制視圖坐標(biāo)系原點(diǎn)為左上角位置.
方法名稱為:- (BOOL)isFlipped{return YES;} 一般聲明某個(gè)控件在窗口的位置用NSMakeRect(0, 0, 110, 110)或者CGRectMake(0, 0, 110, 110)中;
在MacOS 開發(fā)中視圖本身沒有提供背景顏色,邊框,圓角等屬性。但是可以利用layer屬性來控制這些效果,使用這些屬性之前必須設(shè)置其屬性wantsLayer為YES。這一點(diǎn)就相對(duì)于沒有iOS開發(fā)要方便的多,當(dāng)然還可以通過重繪的方法來實(shí)現(xiàn)這些效果- (void)drawRect:(NSRect)dirtyRect
在MacOS開發(fā)中一般以NSWindow為窗口,如果要實(shí)現(xiàn)跳轉(zhuǎn)顯示另一個(gè)窗口需要關(guān)閉當(dāng)前窗口,然后顯示下一個(gè)窗口
?
總結(jié)
以上是生活随笔為你收集整理的MacOS-MacAPP使用Main.storyboard启动视图程序踩坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最全面的github pages搭建个人
- 下一篇: 在国内使用iOS 6看苹果3D地图Fly