一、modal与push
modal从下面往上盖住原来的控制器,一般上一个控制器和下一个控制器没有什么关联时用modal,比如联系人的加号跳转页面,任何控制器都可以用modal
push一般是上下文有关联时用,(比如设置界面的通用跳转页面)导航控制器才能用push
A控制器modal出B控制器,那么A控制器就会强引用B,如果不强引用,无法处理B的业务逻辑(比如点击按钮回答A),会报野指针错误
// modal另一个界面 - (IBAction)modal:(id)sender { // 创建modal的控制器 OneViewController *oneVc = [[OneViewController alloc] init]; // 把新创建的控制器的View添加到窗口上 UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; [keyWindow addSubview:oneVc.view]; // 从下往上钻的动画 // 首先让oneVc的view显示在窗口的底部 oneVc.view.transform = CGAffineTransformMakeTranslation(0, keyWindow.bounds.size.height); // 动画,往上移动,还原形变 // [UIView animateWithDuration:0.5 animations:^{ // // 还原形变 // // CGAffineTransformIdentity清空所有的形变,所有的形变参数都是0 // oneVc.view.transform = CGAffineTransformIdentity; // } completion:^(BOOL finished) { // self.presentedVC = oneVc; // }]; // A控制器modalB控制器,B控制器会被A控制器强引用 // modal一个控制器 [self presentViewController:oneVc animated:YES completion:^{ }]; } // modal:会把新控制器的view添加窗口上,但是不会修改窗口的根控制器 // modal:会把新控制器强引用,谁modal,谁就强引用,为什么要强引用,如果不强引用,新创建的控制器就会被销毁,就不能处理modal出来界面的业务逻辑.
关闭modal出来的控制器
- (IBAction)dismiss:(id)sender { // modal出谁,谁就可以dismiss [self dismissViewControllerAnimated:YES completion:nil]; }