
前言
最近項(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í)知道。

思考
能不能直接使用 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];

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

事實(shí)上,這個(gè)報(bào)錯(cuò)很蛋疼,我找了很久,最后找到了解決辦法: clean 一下就不會(huì)報(bào)錯(cuò)了,真是醉了。
segue是 StoryBoard中轉(zhuǎn)場(chǎng)的意思。



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。


在集成第三方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)鍵。