編碼篇-從一個(gè)第三方的StoryBoard項(xiàng)目中剝離部分功能到純代碼項(xiàng)目中

Paste_Image.png

前言

最近項(xiàng)目中需要實(shí)現(xiàn)視頻監(jiān)控功能,于是就用了某企業(yè)旗下的一款視頻監(jiān)控產(chǎn)品,在集成官方Dome中的監(jiān)控畫(huà)面播放的功能時(shí),發(fā)現(xiàn)整個(gè)項(xiàng)目都是通過(guò)StoryBoard搭建的,然而我的項(xiàng)目是沒(méi)有使用StoryBoard,純代碼開(kāi)發(fā),如果我用純代碼重寫(xiě)里面的功能邏輯當(dāng)然也是行的,只是花費(fèi)的時(shí)間和精力可想而知,這酸爽,誰(shuí)試誰(shuí)知道。


Snip20170207_4.png
思考

能不能直接使用 StoryBoard里面創(chuàng)建好的試圖呢,保留里面的所有設(shè)置,直接取某一部分模塊。整體拖過(guò)來(lái)使用呢?于是就有了這篇文章了。

知識(shí)點(diǎn)

(1)我們都知道試圖的加載過(guò)程是這樣的

1、alloc                   創(chuàng)建對(duì)象,分配空間
2、init (initWithNibName) 初始化對(duì)象,初始化數(shù)據(jù)
3、loadView                 從nib載入視圖 ,通常這一步不需要去干涉。除非你沒(méi)有使用xib文件創(chuàng)建視圖
4、viewDidLoad              載入完成,可以進(jìn)行自定義數(shù)據(jù)以及動(dòng)態(tài)創(chuàng)建其他控件

所以Xcode在加載試圖是優(yōu)先加載 xib文件、StoryBoard文件的,然后才是加載 類文件里面的代碼。這讓我們知道移植 StoryBoard文件到我們純代碼項(xiàng)目后,修改或者添加一些新的內(nèi)容是多么的簡(jiǎn)單和方便。

(2)我們可以通過(guò)以下方法,從StoryBoard 中獲取到一個(gè)VC,并 Push進(jìn)入(這是關(guān)鍵點(diǎn))。

 UIStoryboard *ezMainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
 # EZCameraList 是 Storyborad ID 
 UIViewController *instanceVC = [ezMainStoryboard instantiateViewControllerWithIdentifier:@"EZCameraList"];
 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
 [self.navigationController pushViewController:instanceVC animated:YES];
  /**
   *  下面代碼功能與以上的注釋方法相同
   */
 # go2CameraList 是 一個(gè)segue的名稱
[self performSegueWithIdentifier:@"go2CameraList" sender:nil];
Snip20170207_2.png

**如圖所示,我們修改好一個(gè) VC的Storyborad ID ,如果直接編譯或者運(yùn)行會(huì)報(bào)錯(cuò),如下圖 **


Snip20170207_1.png

事實(shí)上,這個(gè)報(bào)錯(cuò)很蛋疼,我找了很久,最后找到了解決辦法: clean 一下就不會(huì)報(bào)錯(cuò)了,真是醉了。

segue是 StoryBoard中轉(zhuǎn)場(chǎng)的意思。

Snip20170207_5.png
Snip20170207_7.png
Snip20170208_5.png
Tb里面的點(diǎn)擊事件可以用如下方法,響應(yīng)和傳值。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  _cameraIndex = indexPath.row;
  if (_go2Type == 1) {
      [self performSegueWithIdentifier:@"go2Playback" sender:self.deviceInfo];
} else {
      [self performSegueWithIdentifier:@"go2LivePlay" sender:self.deviceInfo];
    }
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.

EZDeviceInfo *deviceInfo = sender;
if ([[segue destinationViewController] isKindOfClass:[EZLivePlayViewController class]]) {
    ((EZLivePlayViewController *)[segue destinationViewController]).deviceInfo = deviceInfo;
    ((EZLivePlayViewController *)[segue destinationViewController]).cameraIndex = _cameraIndex;
} else if ([[segue destinationViewController] isKindOfClass:[EZPlaybackViewController class]]) {
    ((EZPlaybackViewController *)[segue destinationViewController]).deviceInfo = deviceInfo;
    ((EZPlaybackViewController *)[segue destinationViewController]).cameraIndex = _cameraIndex;
}
}
代碼移植的步驟過(guò)程

1.備份原Dome,在Dome中通過(guò) StoryBoard里的試圖關(guān)聯(lián)的類,找到需要移植的類文件,把這些類歸納到一起。
2.StoryBoard中斷開(kāi)不需要的 segue,新建一個(gè)工程,配置好工程,把StoryBoard需要的試圖,按住 Commond,一個(gè)一個(gè)點(diǎn)擊,這樣就選中了需要移植的試圖,包括里面的 segue以及其中的設(shè)置和約束,粘貼到目的工程的 StoryBoard中即完成了 試圖文件的移植。然后再把試圖關(guān)聯(lián)的類文件也一并添加到目的工程中,這樣就完成了部分功能的主要移植了。
3.一般情況下,會(huì)報(bào)很多錯(cuò),然后根據(jù)錯(cuò)誤把需要的其他文件再一一添加到目的工程中。確保目的工程運(yùn)行不報(bào)錯(cuò)時(shí),把圖片文件也移植過(guò)去。
4.把新建工程中剛才移植的全部文件再移植到自己的大工程中,修改微調(diào),達(dá)到你想要的效果。因?yàn)榇蠊こ涛募?,運(yùn)行慢,不利于調(diào)試。

這樣,就完成了從StoryBoard項(xiàng)目中剝離部分功能到純代碼項(xiàng)目中的任務(wù)了。

值得注意的一點(diǎn)是,在修改微調(diào)中,StoryBoard中的試圖中的設(shè)置和約束會(huì)使代碼中的 Frame設(shè)置失效。需要?jiǎng)h除StoryBoard中的試圖中的約束和 Autoresizing才能用代碼設(shè)置試圖的 Frame。

Snip20170209_3.png
Snip20170209_2.png
在集成第三方SDK時(shí)值得嘗試的方法

如果你在集成第三方SDK出現(xiàn)問(wèn)題,糾結(jié)到蛋疼的時(shí)候,可以試試以下方法

  • 打電話給客服

我在客戶那里確定了我所使用的產(chǎn)品可以使用此SDK,避免做無(wú)用功。

  • 加開(kāi)發(fā)者技術(shù)交流群

    在交流群中,通過(guò)其他開(kāi)發(fā)者的提醒,我解決了,棄用SDK中自帶的登錄頁(yè),通過(guò)調(diào)用 開(kāi)發(fā)中API中的接口,達(dá)到了靜默式登錄的效果。

  • 看開(kāi)發(fā)者API文檔

你會(huì)發(fā)現(xiàn)一些有用的接口。


小結(jié)

到此我們知道了三種視圖創(chuàng)建方式 1.通過(guò)StoryBoard 2.通過(guò) xib 3.通過(guò)純代碼生成,這很有用和關(guān)鍵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,629評(píng)論 4 61
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,821評(píng)論 8 183
  • 這些是不是都有我們的影子,或者曾經(jīng)和我們的相似。 現(xiàn)在每一個(gè)人活著都太不容易了,競(jìng)爭(zhēng)越來(lái)越激烈,現(xiàn)實(shí),殘酷。房?jī)r(jià)越...
    幸福的蓋睿閱讀 253評(píng)論 0 0
  • StringBuffer 和 StringBuilder代表可變字符串對(duì)字符串修改時(shí)不會(huì)創(chuàng)建新的對(duì)象StringB...
    DevilIncs閱讀 288評(píng)論 0 1
  • 弄丟了自己
    唯若閱讀 263評(píng)論 0 0

友情鏈接更多精彩內(nèi)容