Встраивание двух UITableViewController в один UIViewController - PullRequest
0 голосов
/ 06 октября 2011

У меня есть дизайн, в котором мне нужно поменять местами два табличных представления, используя один viewcontroller (мне нужно, чтобы для обоих отображался один и тот же заголовок навигации).Поэтому я создал каждое представление таблицы в своем собственном подклассовом классе tableviewcontroller, а затем включил переменную класса для каждого в свой viewcontroller.Каждое табличное представление имеет 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];

    }

У меня есть 2 вопроса:

1) Когда я делаю своп, я вставляю новый просмотр таблицы, анимируяпереход (я не включил код анимации для краткости), затем удаление старого табличного представления из суперпредставления.Это правильный порядок / правильный способ сделать это?Это работает нормально, но мне интересно, нет ли здесь какого-то запаха кода.

2) Используя этот шаблон проектирования, что было бы лучшим способом добавить индикатор активности, который может отображатьсяв то время как каждая таблица загружается?Я пытался внедрить индикатор в viewcontroller, и он, кажется, работал нормально, но я не был уверен, как установить его положение?С точки зрения чего?Центр?Я думаю, это восходит к первому вопросу, который я задал, что такое супервизия и когда, или если вообще есть супервизия?

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Просто используйте два UITableView.

Создайте их и поместите в переменные экземпляра При необходимости сохраните состояние, т. Е. Какое представление таблицы отображается.

1 голос
/ 06 октября 2011

Я не вижу в этом ничего плохого. Я предполагаю, что ваша причина в том, что каждый контроллер таблиц имеет свою собственную логику, чтобы заслужить отдельный класс. Немного необычно встраивать контроллеры в контроллеры, и вам придется передавать вызовы жизненного цикла представления.

Пример:

-(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, но это не повредит. Если вы этого не сделаете, посмотрите на это в инструментах, если контроллер не очищается должным образом.

Вы можете добавить любую активность hud в self.view родительского контроллера, использовать виджет hud, затемнить представление, загружаемое в данный момент, ..., это проблема дизайна, а не техническая. Не забудьте отключить взаимодействие с пользователем, пока вы загружаете (userInteractionEnabled = NO) в родительское представление и кнопку, которая инициировала переключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...