前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编码篇-从一个第三方的StoryBoard项目中剥离部分功能到纯代码项目中

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

作者头像
進无尽
发布2018-09-12 18:23:50
6990
发布2018-09-12 18:23:50
举报
文章被收录于专栏:進无尽的文章

Paste_Image.png

前言

最近项目中需要实现视频监控功能,于是就用了某企业旗下的一款视频监控产品,在集成官方Dome中的监控画面播放的功能时,发现整个项目都是通过StoryBoard搭建的,然而我的项目是没有使用StoryBoard,纯代码开发,如果我用纯代码重写里面的功能逻辑当然也是行的,只是花费的时间和精力可想而知,这酸爽,谁试谁知道。


Snip20170207_4.png

思考

能不能直接使用 StoryBoard里面创建好的试图呢,保留里面的所有设置,直接取某一部分模块。整体拖过来使用呢?于是就有了这篇文章了。

知识点

(1)我们都知道试图的加载过程是这样的

代码语言:javascript
复制
1、alloc                   创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView                 从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad              载入完成,可以进行自定义数据以及动态创建其他控件

所以Xcode在加载试图是优先加载 xib文件、StoryBoard文件的,然后才是加载 类文件里面的代码。这让我们知道移植 StoryBoard文件到我们纯代码项目后,修改或者添加一些新的内容是多么的简单和方便。

(2)我们可以通过以下方法,从StoryBoard 中获取到一个VC,并 Push进入(这是关键点)

代码语言:javascript
复制
 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里面的点击事件可以用如下方法,响应和传值。
代码语言:javascript
复制
- (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.通过纯代码生成,这很有用和关键。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 思考
      • 知识点
        • Tb里面的点击事件可以用如下方法,响应和传值。
          • 代码移植的步骤过程
            • 在集成第三方SDK时值得尝试的方法
              • 小结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档