iOS addChildController的方法

使用默认的ViewController作为盛放childController 的容器。创建FirstViewController作为ChildViewController。在这里我只是简单的实验了一下两个控制器之间的跳转,其中并没有加入数据。因为两个控制器是分离开的。所以很大程度上降低了耦合度。

1 在viewcontroller中

@property(nonatomic, strong) UIViewController *currentVC; 记录当前的控制器 将viewcontroller 作为当前的控制器 _currentVC = self;

2 创建点击按钮,点击弹出childViewController 

[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

3 将firstViewController声明为全局变量。以便后续操作。

4 点击viewcontroller中的按钮 响应事件如下

- (void)btnClick:(UIButton *)btn {

[self addChildViewController:firstVC];

[self.view addSubview:firstVC.view];

[UIView animateWithDuration:2.0 delay:0.5 usingSpringWithDamping:0.5 initialSpringVelocity:0.5 options:UIViewAnimationOptionCurveEaseInOut animations:^{

firstVC.baseView.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2);

} completion:^(BOOL finished) {

NSLog(@"完成");

}];

}

********重要的点在点击按钮时 ,按钮响应方法中 [self addChildViewController:_firstVC];

和[self.view addSubview:_firstVC.view]; 一个是讲firstVC作为当前控制器的子视图控制器。另一个addSubview方法是讲firstVC的视图添加到当前视图,作为子视图显示。在firstVC视图出现时,我添加了动画效果。

5 在firstViewControl中 需要有回调方法。在这里我用的block 在firstViewController中我添加了一个点击按钮。点击按钮会将Block传到viewController中

- (void)btnClick:(UIButton *)btn {

self.firstBlock();

}

6 在viewcontroller中 接受childViewcontroller传过来的block 

firstVC = [[FirstViewController alloc] init];

__weak FirstViewController *weakSelf = firstVC;

firstVC.firstBlock = ^(){

[weakSelf removeFromParentViewController];

[UIView animateWithDuration:2.0 delay:0.5 usingSpringWithDamping:0.5 initialSpringVelocity:0.5 options:UIViewAnimationOptionCurveEaseInOut animations:^{

weakSelf.baseView.frame = CGRectMake(0, -weakSelf.baseView.frame.size.height, weakSelf.baseView.frame.size.width, weakSelf.baseView.frame.size.height);

} completion:^(BOOL finished) {

[weakSelf.view removeFromSuperview];

_currentVC = weakSelf;

NSLog(@"完成");

}];

};

在这里由于用到动画,所以涉及到firstViewController中的frame。在这里就会牵扯到block的循环引用问题了。 __weak FirstViewController *weakSelf = firstVC; 用__weak修饰自身。weak是弱引用,不会持有对象。所以在block里面使用self时就不会再造成相互持有。retain cycle了。[weakSelf removeFromParentViewController]; firstVC 从当前视图控制器中移除。在动画完成时 将当前的currentVC = self;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 7,346评论 1 14
  • 1. 什么是 ARC? (ARC 是为了解决什么问题而诞生的?) ARC 是 Automatic Referenc...
    milk_powder阅读 3,923评论 0 5
  • 拿俄米啊,我的婆婆 摩押是有祸的地土,可悲的歌 你没有了丈夫以利米勒,没有了儿子和果腹的生活 你满满地出去,空空地...
    守素阅读 3,375评论 11 8
  • 一说到存款就心塞塞的 八月份的工资给了中秋节 九月份的工资给了国庆节 下个月还有双十一 别问我怎么还存不到钱 发觉...
    小一哥阅读 7,361评论 0 3
  • 昨日,在梦里,我被埋在地下,有人写了一篇计划,就是要炸掉那里,营救我。但在土里我快窒息了。忽然从梦中惊醒,那...
    老大1224阅读 2,372评论 0 0

友情链接更多精彩内容