Добавление и удаление подпредставлений в серии - PullRequest
1 голос
/ 13 января 2012

Мне трудно управлять представлениями в моем приложении, и буду признателен всем, кто предоставит некоторые разъяснения.На мой взгляд, программа структурирована как иерархия следующим образом.

    BNG_AppViewController:UIViewController  

-calls-

    NameListSelectionController:UIViewContoller

-calls-

    GameViewController:UIViewController

-звонки-

    NameResultsController:UIViewController

Все подпредставления, которые построены с использованием XIB из построителя интерфейса, вызываются идентично следующему:

    NameListSelectionController *NameListSelectionControllerScreen = [[NameListSelectionController alloc] initWithNibName:@"NameListSelectionController" 
              bundle:nil];
    [self.view addSubview:NameListSelectionControllerScreen.view];

Когда я хочу перейти вверхВ моей иерархии представлений я использую вызов, идентичный следующему, из класса контроллера - обычно использую кнопку для запуска вызова.

    [self.view removeFromSuperview];

Используя этот метод, я могу перемещаться вверх и вниз по своей иерархии влинейный стильдо 1-го уровня.

До сих пор я пытался удалить представление 2-го уровня из иерархии при вызове третьего уровня на пути вниз по иерархии, но безрезультатно.

    [self.view removeFromSuperview];
    gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
    [self.view addSubview:gameScreen.view];

Тем не менее, я, кажется, в конечном итоге обратнона моем 1-м уровне, без какого-либо явного влияния на вторую и третью строки кода.Я также попытался отправить 2-й уровень иерархии назад, без каких-либо результатов.

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

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

Ответы [ 3 ]

1 голос
/ 13 января 2012

для этой цели вы можете использовать навигационный контроллер.
и когда вы хотите пропустить одно всплывающее окно, вы можете использовать -[UINavigationController popToRootViewControllerAnimated:] или -[UINavigationController popToViewController:animated:] для этого.

-(void)goToMainCategoryView;
{
    id object = nil;

    for (UIViewController *viewControl in self.navigationController.viewControllers)
    {
        if(viewControl.view.tag == 0)
        {
            object = viewControl;
        }
    }
    [self.navigationController popToViewController:object animated:YES];
}
0 голосов
/ 13 января 2012

Вы сталкиваетесь с проблемой в этом

[self.view removeFromSuperview];
gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
[self.view addSubview:gameScreen.view];

что ваше текущее представление не удалено или ваше следующее представление не будет отображаться с использованием этого кода? Если да, то вы можете использовать это

for (UIView *view in self.view.subviews) {
        if ([view isKindOfClass:[BNG_AppViewController class]] || [view isKindOfClass:[NameListSelectionController class]] || [view isKindOfClass:[NameResultsController class]]) {
            [view removeFromSuperview];
        }
    } 

Чтобы удалить представления из суперпредставления, а затем добавить это

gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
    [self.view addSubview:gameScreen.view];
0 голосов
/ 13 января 2012

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

При управлении памятью, если вы используете ARC (автоматический подсчет ссылок), вы ничего не пропускаете.Если это не так, вы просачиваетесь каждый раз, когда вы выделяете-инициализируете UIView и добавляете в качестве подпредставления без последующего вызова «release» в этом представлении.Когда вы добавляете UIView в качестве подпредставления, родительское представление сохраняет его, поэтому вы, как вызывающая сторона, можете свободно вызывать release для него, не беспокоясь о его освобождении.

Похоже, вы хотите сделать именно то, для чего был разработан UINavigationController, представляя серию представлений в иерархии.Это позволяет вам выдвигать / вставлять в / из любого представления в стеке и отслеживать все представления для вас.Мне действительно кажется, что это будет ваш лучший выбор здесь.

...