【问题标题】:conceptual or technical issue with Cocoa programmingCocoa 编程的概念或技术问题
【发布时间】:2010-10-10 16:40:24
【问题描述】:

我发现自己需要从视图访问视图控制器。

方法如下

-(void)changePageView:(UIViewController*)newviewcont withtransitiontype:(int)t andtransitionspeed:(int)s
{
    //Remove whatever view is currently loaded at index 0, this index is only to be used by "page" views
    UIView *oldview = [self.view.subviews objectAtIndex:0];

    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:s];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
    [newviewcont viewWillAppear:YES];
    //[oldview viewWillDisappear:YES];
    [oldview removeFromSuperview];
    [self.view insertSubview:newviewcont.view atIndex:0];
    //[oldview viewDidDisappear:YES];
    [newviewcont viewDidAppear:YES];

}

基本上,我正在尝试编写一个由根控制器调用的通用视图切换方法,以从根控制器视图中换出 subviewcontorllers 视图。

我传入了一个 subviewcontroller 并能够删除当前的子视图。但是为了做正确的视图切换动画,我需要访问当前视图视图控制器。这是错误的方法吗?可以做到吗?

【问题讨论】:

    标签: ios objective-c cocoa cocoa-touch


    【解决方案1】:

    我向根控制器添加了一个成员,该成员持有当前的子视图控制器 (currentController),并在控制器交换完成时引用它

    -(void)changePageView:(UIViewController*)newviewcont withtransitiontype:(int)t andtransitionspeed:(int)s
    {
    
    
        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:s];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
        [newviewcont viewWillAppear:YES];
        [self.currentController viewWillDisappear:YES];
        [self.currentController.view removeFromSuperview];
        [self.view insertSubview:newviewcont.view atIndex:0];
        [self.currentController viewDidDisappear:YES];
        [newviewcont viewDidAppear:YES];
        [UIView commitAnimations];
    
    
        self.currentController = newviewcont;
    
    }
    

    【讨论】:

      【解决方案2】:

      changeView() 方法属于视图控制器。它会解决你让视图知道它的控制器的问题(它不应该),而且更有意义。

      此外,除非您在 changeView() 中做一些花哨的事情,而使用 UIViewController 对象中的方法无法完成,那么您应该使用它来代替,如果需要实现您自己的视图切换方法,那么您可以扩展 UIViewController 而不是在您的视图中实现部分视图控制器。

      我的 2 美分 :)

      【讨论】:

      • changepageview 方法在 rootview 控制器中。问题是我想要一个 viewcontroller 的句柄,它的视图当前位于 rootviewcontrollers 视图的索引 0 处。我可以访问索引 0 处的视图,但不能访问它的视图控制器。
      • 来自 OP '我正在尝试编写一个由根控制器调用的通用视图切换方法,以从根控制器视图中交换子视图控制器视图。除非我误解了你在这个功能背后的意图,否则 UIViewcontroller 已经提供了这个功能。
      【解决方案3】:

      我相信你的方法是错误的。我相信你应该看看 UINavigationController。

      【讨论】:

      • 他可能不想要导航栏(不用它也可以实现视图切换)
      • 你是对的。我确实有错误的方法。本质上,我是在与 MVC 范式作斗争。我仍在尝试了解如何在某些情况下应用 MVC,但至少正在取得进展!