編碼篇-從一個第三方的StoryBoard項目中剝離部分功能到純代碼項目中

Paste_Image.png

前言

最近項目中需要實現視頻監控功能,于是就用了某企業旗下的一款視頻監控產品,在集成官方Dome中的監控畫面播放的功能時,發現整個項目都是通過StoryBoard搭建的,然而我的項目是沒有使用StoryBoard,純代碼開發,如果我用純代碼重寫里面的功能邏輯當然也是行的,只是花費的時間和精力可想而知,這酸爽,誰試誰知道。


Snip20170207_4.png
思考

能不能直接使用 StoryBoard里面創建好的試圖呢,保留里面的所有設置,直接取某一部分模塊。整體拖過來使用呢?于是就有了這篇文章了。

知識點

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

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

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

(2)我們可以通過以下方法,從StoryBoard 中獲取到一個VC,并 Push進入(這是關鍵點)

 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 是 一個segue的名稱
[self performSegueWithIdentifier:@"go2CameraList" sender:nil];
Snip20170207_2.png

**如圖所示,我們修改好一個 VC的Storyborad ID ,如果直接編譯或者運行會報錯,如下圖 **


Snip20170207_1.png

事實上,這個報錯很蛋疼,我找了很久,最后找到了解決辦法: clean 一下就不會報錯了,真是醉了。

segue是 StoryBoard中轉場的意思。

Snip20170207_5.png
Snip20170207_7.png
Snip20170208_5.png
Tb里面的點擊事件可以用如下方法,響應和傳值。
- (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;
}
}
代碼移植的步驟過程

1.備份原Dome,在Dome中通過 StoryBoard里的試圖關聯的類,找到需要移植的類文件,把這些類歸納到一起。
2.StoryBoard中斷開不需要的 segue,新建一個工程,配置好工程,把StoryBoard需要的試圖,按住 Commond,一個一個點擊,這樣就選中了需要移植的試圖,包括里面的 segue以及其中的設置和約束,粘貼到目的工程的 StoryBoard中即完成了 試圖文件的移植。然后再把試圖關聯的類文件也一并添加到目的工程中,這樣就完成了部分功能的主要移植了。
3.一般情況下,會報很多錯,然后根據錯誤把需要的其他文件再一一添加到目的工程中。確保目的工程運行不報錯時,把圖片文件也移植過去。
4.把新建工程中剛才移植的全部文件再移植到自己的大工程中,修改微調,達到你想要的效果。因為大工程文件多,運行慢,不利于調試。

這樣,就完成了從StoryBoard項目中剝離部分功能到純代碼項目中的任務了。

值得注意的一點是,在修改微調中,StoryBoard中的試圖中的設置和約束會使代碼中的 Frame設置失效。需要刪除StoryBoard中的試圖中的約束和 Autoresizing才能用代碼設置試圖的 Frame。

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

如果你在集成第三方SDK出現問題,糾結到蛋疼的時候,可以試試以下方法

  • 打電話給客服

我在客戶那里確定了我所使用的產品可以使用此SDK,避免做無用功。

  • 加開發者技術交流群

    在交流群中,通過其他開發者的提醒,我解決了,棄用SDK中自帶的登錄頁,通過調用 開發中API中的接口,達到了靜默式登錄的效果。

  • 看開發者API文檔

你會發現一些有用的接口。


小結

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協議。它實...
    香橙柚子閱讀 24,099評論 8 183
  • 這些是不是都有我們的影子,或者曾經和我們的相似。 現在每一個人活著都太不容易了,競爭越來越激烈,現實,殘酷。房價越...
    幸福的蓋睿閱讀 230評論 0 0
  • StringBuffer 和 StringBuilder代表可變字符串對字符串修改時不會創建新的對象StringB...
    DevilIncs閱讀 237評論 0 1
  • 弄丟了自己
    唯若閱讀 249評論 0 0