【问题标题】:How does UITabBarController work?UITabBarController 是如何工作的?
【发布时间】:2011-03-14 20:46:49
【问题描述】:

我正在制作一个与 UITabBarController 类似的自定义东西——一个管理子 ViewController 的 UIViewController。父 UIViewController 应该管理添加和删除子 UIViewController 的视图。

如果我以这种方式做事,我似乎需要手动致电[UIViewController viewWillAppear] 和朋友。是这样吗?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: iphone uiviewcontroller


    【解决方案1】:

    也许你想用这些方法创建一个单例:

    @interface RootViewController : UIViewController {
    
        UIViewController *currentVC;
    
    }
    
    -(void) destroyCurrent;
    -(void) switchToViewController: (int) controller;
    
    -(void) switchToViewController: (int) controller {
    
        [self destroyCurrent];
    
        switch (controller) {
            case 0:
                MyViewController *viewController = [[MyViewController alloc] init];
                currentVC = viewController;
                break;
            //case 1: ...
            default:
                break;
        }
    
        [self.view addSubview:currentVC.view];
    }
    
    -(void) destroyCurrent {
    
        if (currentVC) {
            [currentVC.view removeFromSuperview];
            [currentVC release];
            currentVC = nil;
        }
    }
    

    通过调用switchToViewController: (int) controller 可以更改视图控制器。

    【讨论】:

    • 这对调用 viewWillAppear 之类的方法没有帮助。
    • 是的,但是您可以将 viewWillAppear 中所需的内容移动到 init。或者在[self.view addSubview:currentVC.view]; 之后添加[currentVC performSelector: @selector(viewWillAppear:)]; 行。在“销毁”视图之前添加[currentVC performSelector: @selector(viewWillDisappear:)]; 也将起作用。
    • 为什么要performSelector: 而不是仅仅调用选择器?
    • 我通常这样做是因为您可以在调用它执行一个对象之前检查一个对象是否响应选择器。此外,在这种特殊情况下,我总是在视图之间使用某种转换,因此我需要一种方法来在延迟后执行某些操作。
    【解决方案2】:

    你为什么要这样做?为什么不使用 UITabBarController?

    无论如何...我会尝试这样的事情

    - (void) selectViewControllerAtIndex:(int)index {
        [[self.viewControllers objectAtIndex:self.selectedVCIndex].view removeFromSuperview];
        self.selectedVCIndex = index;
        [self.view addSubView:[self.viewControllers objectAtIndex:index].view];
        [self.view setNeedsLayout];
    }
    

    但从未尝试过。

    【讨论】:

    • 这段代码可能会爆炸!我想你需要[self.view addSubView:[self.viewControllers objectAtIndex:index]].view
    • ... UITableViewController 跟什么有什么关系?我想做一个自定义标签栏。
    • Ups,我应该说 UITabBarController... 无论如何,代码保持不变。
    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多