关于UIViewController中的一些事情,我真的很困惑

时间:2013-05-03 12:11:37

标签: ios objective-c uiviewcontroller

我对UIViewController中的一些事情感到很困惑,我已经阅读了View Controller Programming Guide并在互联网上搜索了很多内容但仍感到困惑。

当我想跳转或从firstVC切换到secondVC时,有多少种方法可用?我列出了我知道的事情:

  1. UINavigationController

  2. UITabBarController

  3. presentModalViewController:

  4. 将secondVC添加到根视图

    • 如果将secondVC添加到根视图中,那么将如何释放firstVC对象?
    • 添加我想要跳转/切换到根视图的每个视图是一个好习惯吗?
  5. transitionFromView:

    • 我不理解Apple doc的这一部分:
  6.   

    此方法仅修改视图层次结构中的视图。确实如此   不以任何方式修改应用程序的视图控制器。对于   例如,如果使用此方法更改a显示的根视图   查看控制器,您有责任更新视图   控制器适当地处理变化。

    如果我这样做:

    secondViewController *sVc = [[secondViewController alloc]init];
    
    [transitionFromView:self.view toView:sVc.view...
    

    viewDidLoad:viewWillAppear:viewDidAppear:工作正常:我无需打电话给他们。那么为什么Apple会说这个:

      

    您有责任相应地更新视图控制器以处理更改。

    还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

实际上使用的标准方法是:

1)使用NavigationController

 //push the another VC to the stack
[self.navigationController pushViewController:anotherVC animated:YES];

//remove it from the stack
[self.navigationController popViewControllerAnimated:NO];

//or presenting another VC from current navigationController     
[self.navigationController presentViewController:anotherVC animated:YES completion:nil];

//dismiss it
[self.navigationController dismissViewControllerAnimated:YES completion:nil];

2)介绍VC

//presenting another VC from current VC     
[self presentViewController:anotherVC animated:YES completion:nil

//dismiss it
[self dismissViewControllerAnimated:YES completion:nil];

永远不要使用您在第4点中描述的方法。动态更改根视图控制器不是一个好习惯。 window的根VC通常是在applicationdidfinishlaunchingwithoptions上定义的,如果你要遵循苹果标准就不应该改变它。

transitionFromView示例:toView

-(IBAction) anAction:(id) sender {
// assume view1 and view2 are some subviews of self.view
// view1 will be replaced with view2 in the view hierarchy
[UIView transitionFromView:view1 
                    toView:view2 
                  duration:0.5 
                   options:UIViewAnimationOptionTransitionFlipFromLeft   
                completion:^(BOOL finished){
                    /* do something on animation completion */
                  }];
  }

}