Storyboard

编码篇-从一个第三方的StoryBoard项目中剥离部分功能到纯

2017-02-10  本文已影响77人  進无尽
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,避免做无用功。

你会发现一些有用的接口。


小结

到此我们知道了三种视图创建方式 1.通过StoryBoard 2.通过 xib 3.通过纯代码生成,这很有用和关键。

上一篇下一篇

猜你喜欢

热点阅读