前言
最近項目中需要實現視頻監控功能,于是就用了某企業旗下的一款視頻監控產品,在集成官方Dome中的監控畫面播放的功能時,發現整個項目都是通過StoryBoard搭建的,然而我的項目是沒有使用StoryBoard,純代碼開發,如果我用純代碼重寫里面的功能邏輯當然也是行的,只是花費的時間和精力可想而知,這酸爽,誰試誰知道。
思考
能不能直接使用 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];
**如圖所示,我們修改好一個 VC的Storyborad ID ,如果直接編譯或者運行會報錯,如下圖 **
事實上,這個報錯很蛋疼,我找了很久,最后找到了解決辦法: clean 一下就不會報錯了,真是醉了。
segue是 StoryBoard中轉場的意思。
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。
在集成第三方SDK時值得嘗試的方法
如果你在集成第三方SDK出現問題,糾結到蛋疼的時候,可以試試以下方法
- 打電話給客服
我在客戶那里確定了我所使用的產品可以使用此SDK,避免做無用功。
- 加開發者技術交流群
在交流群中,通過其他開發者的提醒,我解決了,棄用SDK中自帶的登錄頁,通過調用 開發中API中的接口,達到了靜默式登錄的效果。
- 看開發者API文檔
你會發現一些有用的接口。
小結
到此我們知道了三種視圖創建方式 1.通過StoryBoard 2.通過 xib 3.通過純代碼生成,這很有用和關鍵。