iOS 获取Interface Builder上的子控制器的两种方式

原创Blog,转载请注明出处

blog.csdn.net/hello_hwc



准备工作

Storyboard上为一个ViewController拖拽两个子控制器,并且设置两个segue的identifier分别为childvc1,childvc2

效果


方式一,根据segue的identifier来判断获得

#import "ViewController.h"
#import "ChildViewController1.h"
#import "ChildViewController2.h"
@interface ViewController ()
@property (weak,nonatomic)ChildViewController1 * childvc1;
@property (weak,nonatomic)ChildViewController2 * childvc2;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.childvc1.view.backgroundColor = [UIColor blueColor];
    self.childvc2.view.backgroundColor = [UIColor greenColor];
    // Do any additional setup after loading the view, typically from a nib.
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.identifier isEqualToString:@"childvc1"]) {
        self.childvc1 = segue.destinationViewController;
    }
    if ([segue.identifier isEqualToString:@"childvc2"]) {
        self.childvc2 = segue.destinationViewController;
    }
}

@end

两点要注意

  1. prepareForSegue在这里要早于viewDidLoad被调用
  2. 使用weak引用是为了不参与子控制器的生命周期

方式二,借助KVC的特性,创建一些通用的代码

#import "ViewController.h"
#import "ChildViewController1.h"
#import "ChildViewController2.h"
@interface ViewController ()
@property (weak,nonatomic)ChildViewController1 * childvc1;
@property (weak,nonatomic)ChildViewController2 * childvc2;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.childvc1.view.backgroundColor = [UIColor blueColor];
    self.childvc2.view.backgroundColor = [UIColor greenColor];
    // Do any additional setup after loading the view, typically from a nib.
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([self respondsToSelector:NSSelectorFromString(segue.identifier)]) {
        [self setValue:segue.destinationViewController forKey:segue.identifier];
    }
}

@end

注意,这里的

segue的identifier一定要和声明的对应子控制器的属性一致。

原理-利用KVC的动态特性

  1. 因为子控制器的属性名称与segue.identifer一致,所以只需要判断respondsToSelector:NSSelectorFromString(segue.identifier)就知道当前是不是为对应的子控制器来prepareForSegue
  2. 这里的 respondsToSelector:NSSelectorFromString(segue.identifier)就是是否含有对应的get方法
  3. 通过KVC的方式进行赋值

时间: 2024-10-18 03:11:36

iOS 获取Interface Builder上的子控制器的两种方式的相关文章

ios UI加载xib文件到控制器的两种方式(MS)

X-code6.3 创建xib文件 加载xib文件到控制器的两种方式(MS) // 1.第一种方式 //    NSArray * array = [[NSBundle mainBundle]loadNibNamed:@"cell" owner:nil options:nil]; //    MyTableViewCell * cell = [array firstObject]; 其中cell为新建的xib文件名 // 2.第二种方式 UINib * nib = [UINib nib

获取远程文章内容时,显示图片的两种方式

第一种: 通过Html.fromHtml(String,ImageGetter,tagHandler) CharSequence text = Html.fromHtml(capter, new ImageGetter() {                                        @Override                    public Drawable getDrawable(String source) {                        

自学iOS开发小功能之三:弹框的两种方式(iOS8.3之后新的方式,之前的已经弃用)

1.弹框出现在屏幕中间位置 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"是否退出" preferredStyle: UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActio

iOS开发项目篇—02添加子控制器以及项目分层

iOS开发项目篇—02添加子控制器以及项目分层 一.添加子控制器 1.设置根控制器(自定义) 说明:分析新浪微博应用,观察其整体建构层次.而系统的控制器不能满足项目开发的需求,这里把项目中原有的控制器删除. 自己定义一个TabBarViewController类.让这个类作为window窗口的根控制器. YYAppDelegate.m文件代码: 1 #import "YYAppDelegate.h" 2 #import "YYTabBarViewController.h&qu

IOS - xib(Interface Builder,view) - can't change view size(view不能改变大小问题)

很多时候,我们自定义tableview.collectionview的cell,也有时候我们要自定义窗口xib,但创建xib后,其height.width不可修改. 这时问题就来了,怎么才能使我们的自定义xib宽高可修改: 项目中创建xib,单独的view时, 方法: 默认Simulated metric中Size:inferred(推断),则view的height.width不可改变: 修改为Size:Freeform,现在我们的xib view 宽高可修改了. 学习并转载:http://ip

iOS 使用interface builder 创建太复杂的constrains时容易产生crash

今天写程序,遇到了crash,在界面初始化时不会有,想切换到别的tab页就报错了.主要内容如下: Cannot find an outgoing row head for incoming head UIImageView:0x156caec0.Width{id: 103}, which should never happen. 查了一晚上也没有查出真正原因,最后从xib中删除了2个view,系统正常了.我想,大概使用了过多的不确定constraint,这些constraint对于人脑来说是可以

android/IOS常用图片上传的两种方式

android/IOS常用图片上传的两种方式: 1.上传到服务器的文件服务器(FileServer) 原理:上传到文件服务器的方式是先在服务器端搭建文件服务器,配置好路径(url),该路径是我们待会上传图片的路径,配置成功后便通过http+post的模式上传到文件服务器,同时文件服务器将返回一个图片ID,这个ID就是图片的唯一标识,并将该ID写入数据库保存,当需要下载该图片时只需要将此ID带上即可. 两个核心问题: (1)服务端:配置FileServer,并写处理响应上传图片的代码,这个值得去网

ios中创建控制器的几种方式

1.通过storyboard创建: (1)先加载storyboard文件: UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Test"  bundle:nil]; (2) 初始化storyboard中的控制器: ①初始化"初始控制器":HLViewController * hl = [storyboard instantiateInitialViewController]; ②通过标识初始

Simics虚拟机Solaris 8操作系统获取host 系统win7上的文件的两种方式

1 介绍 本文基于的环境设置如下: ? 宿主操作系统:Windows 7 Ultimate ? 寄生操作系统:Solaris 8 SPARC (SunOS 5.8) ? 虚拟环境:Simics 3.0.4 本文假定已在Simics 上安装好Solaris 8 SPARC 操作系统. 动机:一个Unix下可以运行的二进制文件GraphGen,在单独的一台装有Ubuntu的电脑上不能运行,因为该电脑的硬件架构是基于X86的,而GraphGen是SPARC架构下才能运行的程序:在我的笔记本Win7系统