在一个UIViewController中嵌入两个UITableViewControllers

时间:2011-10-06 00:53:11

标签: iphone ios cocoa-touch design-patterns

我有一个设计,我需要使用一个viewcontroller交换进出两个tableviews(我需要为两者显示相同的导航标题)。所以我在自己的子类tableviewcontroller类中创建了每个tableview,然后我在viewcontroller中为每个包含了一个类变量。每个tableview都将viewcontroller作为父视图,并在需要进行交换时调用viewcontrollers交换方法。下面列出了此方法和viewDidLoad方法:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[self navigationItem] setTitle: AddAPhotoViewControllerTitle];

    SelectAnAlbumTableViewController *selectAnAlbumTableViewControllerTemp = [[SelectAnAlbumTableViewController alloc] initWithParent: self];
    [self setSelectAnAlbumTableViewController: selectAnAlbumTableViewControllerTemp];
    [selectAnAlbumTableViewControllerTemp release];

    [[self view] insertSubview: [[self selectAnAlbumTableViewController] tableView] atIndex: 0];
}

- (void) switchTableViews
{
    if ([[[self selectAnAlbumTableViewController] tableView] superview] == nil)
    {


        [[self view] insertSubview: [[self selectAnAlbumTableViewController] tableView] atIndex: 0];


             [[[self selectAPhotoTableViewController] tableView] removeFromSuperview];
             [selectAPhotoTableViewController release];
             selectAPhotoTableViewController = nil;
    }
    else 
    {
        SelectAPhotoTableViewController *selectAPhotoTableViewControllerTemp = [[SelectAPhotoTableViewController alloc] initWithAssetGroup: [[self selectAnAlbumTableViewController] assetGroup] parent: self];
        [self setSelectAPhotoTableViewController: selectAPhotoTableViewControllerTemp];
        [selectAPhotoTableViewControllerTemp release];

        [[self view] insertSubview: [[self selectAPhotoTableViewController] tableView] atIndex: 0];

            [[[self selectAnAlbumTableViewController] tableView] removeFromSuperview];

    }

我有两个问题:

1)当我正在进行交换时,我正在插入新的tableview,为转换设置动画(我没有包含动画代码以保持简洁),然后从superview中删除旧的tableview。这是正确的顺序/正确的方法吗?它工作正常,但我想知道这里是否有一些代码味道。

2)使用这种设计模式,在每个tableview加载时可以显示的活动指示器的最佳方法是什么?我已经尝试在viewcontroller中实现指示器,它似乎工作正常,但我不知道如何设置它的位置?在什么方面?中心?我想这可以追溯到我问过的第一个问题,什么是超级视图,什么时候,或者甚至是否有超级视图?

2 个答案:

答案 0 :(得分:2)

只需使用两个UITableViews。

实例化它们并将它们放在实例变量中。如果需要,保存状态,即显示哪个表视图。

答案 1 :(得分:1)

我认为没有错。我假设你的理由是每个表控制器都有自己的逻辑,值得一个单独的类。将控制器嵌入控制器中有点不正统,您必须通过视图生命周期调用。

示例:

-(void) switch
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.75];
    [UIView setAnimationDelegate:self];

    if ([self.visibleVC isKindOfClass:[OrangeVC class]])
    {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
        [self.visibleVC viewWillDisappear:TRUE];
        [self.visibleVC.view removeFromSuperview];
        self.visibleVC = self.appleVC;
        [self.view addSubview:self.visibleVC.view];
    }
    else if ([self.visibleVC isKindOfClass:[AppleVC class]])
    {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
        [self.visibleVC viewWillDisappear:TRUE];        
        [self.visibleVC.view removeFromSuperview];
        self.visibleVC = self.orangeVC;
        [self.view addSubview:self.visibleVC.view];
    } 
    [self.visibleVC viewWillAppear:TRUE];
    [UIView commitAnimations];
}

注意viewWillAppear调用,至少需要唤醒表。我不确定你是否应该调用viewWillDisappear,但它不会受到伤害。如果不这样做,请在仪器中观察,以防控制器未正确清洁。

您可以在父控制器的self.view中添加任何活动hud,使用hud小部件,使当前加载的视图变暗,......,这是一个设计问题而不是技术问题。记住在父视图和启动切换的按钮上加载(userInteractionEnabled = NO)时禁用用户交互。