【iOS7的一些总结】3、视图控制器ViewControllers之间的数据传递(2)
上文中记录了在手写代码实现UI的情况下,界面切换时不同视图控制器之间数据传递的机制。显示和消除界面使用的函数时presentViewController和dismissViewController函数,数据传递则可以采用代理、通知等机制。本文记录的是使用storyboard实现界面的情况下,采用segue相关的方法实现与上文中相同的功能。
首先要做的是新建一个单视图工程,建立完成后会生成一组(一个头文件和一个源文件称为一组)AppDelegate类,一组ViewController类,一个storyboard以及其他一些辅助文件。然后需要新建一个视图控制器类,使用快捷键command+N,选择Objective-C类,新建一组名为FirstSubViewController的视图控制器继承自UIViewController。
下面在storyboard中添加各种控件。按照之前的设计,将一个Label和一个Button加入到第一个sence中。然后,在storyboard中拖入一个新的视图控制器,在其中加入一个TextField和一个Button。同时别忘了给控件添加IBOutlet和IBAction,以及将第二个界面的ViewController类改为我们之前新建好的FirstSubViewController类。
在不同的界面之间建立segue非常简单,只需要在触发控件(比如Button)上按住Ctrl并拖动至新的界面,并在弹出菜单中选择Modal选项。在Attribute菜单中为segue添加一个ID,然后用类似的方法将第二个ViewController的按钮segue到第一个界面上。
然后一个在两个界面之间的segue就已经建立完成,如下图所示。
此时运行一下程序将会发现,从第一个界面中点击“显示下一界面按钮”,将会跳转到第二个界面中;点击“返回上一界面”,将会跳回最初的界面。
然后实现让第一个界面中的Label获取第二个界面中TextField中的内容,实现方法很简单,即在第二个界面的视图控制器中实现prepareForSegue函数即可。
在ViewController.h中添加一个property,用于接收传过来的字符:
@property (nonatomic,copy) NSString *stringToReceive;
需要注意的是,不要试图将UILabel类型的IBOutlet声明为公开属性用于接收字符串,因为在下面的prepareForSegue的方法中,不能直接获取到有效的Label实例。
然后再viewDidLoad函数中判断该属性是否为空,不为空则赋给标签:- (void)viewDidLoad [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. if (_stringToReceive != Nil) _showText.text = _stringToReceive; }
在firstSubViewController中实现函数:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender if ([segue.identifier isEqualToString:@"goBackToPreviousViewController"]) if ([segue.destinationViewController isKindOfClass:[ViewController class]]) ViewController *vc = (ViewController *)segue.destinationViewController; vc.stringToReceive = _inputText.text; }这里面“goBackToPreviousViewController”是自己定义的segue ID。
自此,整个工程就已经完成了,运行测试一下发现一切正常。
本文和上文的两个demo已经上传到了资源页,需要的话可以下载作为参考。
理解iOS端的WebView同层组件 同层组件的目标是将原生组件渲染在与其他Web组件同一层级中。在iOS中,我们使用WKWebView来创建Web视图,WKWebView在进行解析渲染时,会将Web组件渲染到WKCompositingView上,这个View是一个原生的UIView子类,通常WKWebView内核会将多个组件共同渲染到同一个WKCompositingView上,但是如果某个HTML标签的style设置了overflow: scroll属性,并且内容超出容器的大小,WKWebView就会为其单独的创建一个WKChildScrollView,因此如果我们可以找到这个View,并和对应的Web组件一一关联起来,就可以将
在开发过程中,经常需要获取当前 window, rootViewController, 以及当前 ViewController 的需求. 如果 .m 实现不是在当前视图情况下, 我们需要快速的获取到当前控制器, 这种情况就需要先做好一层封装,我一般是通过 UIViewController 写的一个 Category 来实现, 实现起来也非常简单, 只需要我们对 控制器几个方法掌握便可。
[super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.
jerry.yin 毕业于上海大学通信与信息工程学院,从事流媒体和视频编解码的研究与开发工作; 研究领域包括视频编解码标准、视频处理和流媒体技术、移动互联网技术等。
相关文章
- 使用elasticdump做数据迁移
- Matlab使用Plot函数实现数据动态显示方法总结
- SharePoint 2010 站点附加数据升级到SP2013
- 断电数据保存问题
- 恢复MySQL主从数据一致性的总结
- 阿里P7大牛整理!java数据字典翻译,干货整理
- 使用JDBC连接MySQL数据库--典型案例分析(四)----更新和插入员工数据
- WPF:数据绑定总结(1) https://segmentfault.com/a/1190000012981745
- 运维专家:我在大数据项目中踩过的那些坑
- Redis数据"丢失"讨论及规避和解决的几点总结
- 高可用数据容灾 同有科技助力河北省人民检察院数据中心升级
- 从es中拉取全部数据/大量数据 使用scroll+scan避免深分页
- NAS数据迁移初探
- 数据导入与预处理-课程总结-资料汇总贴
- ASP.NET MVC Model元数据及其定制:一个重要的接口IMetadataAware
- concepts阅读总结7——数据字典
- 华为手表开发:WATCH 3 Pro(13)websocket 请求数据到服务器
- 基于深度学习(Pytorch)的视频识别项目 数据预处理部分的小总结
- Kafka 数据丢失问题总结
- 【iOS7的一些总结】2、视图控制器ViewControllers之间的数据传递(1)