Программное переключение представлений в Cocoa Touch - PullRequest
6 голосов
/ 16 декабря 2008

Как можно программно изменить представление на экране в приложении для iPhone?

Я был в состоянии создавать навигационные представления и программно выдвигать / выдавливать их, чтобы создать такое поведение, но если я хотел просто изменить текущее представление (не используя объект контроллера UINavigation), то какой самый удобный способ добиться этого

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

Мне еще предстоит увидеть какие-либо примеры, которые пытаются сделать это, и я, кажется, недостаточно разбираюсь в отношениях и процедуре инициализации между объектами UIViewController / UIView, чтобы достичь этого программным путем.

Ответы [ 7 ]

8 голосов
/ 16 декабря 2008

Я использую presentModalViewController:animated:, чтобы вызвать представление настроек из моего главного окна UIViewController, а затем, когда пользователь нажимает «Готово» в представлении настроек, я вызываю dismissModalViewControllerAnimated: из представления настроек (возвращаясь к родительскому представлению). ) вот так:

[[self parentViewController] dismissModalViewControllerAnimated:YES];
3 голосов
/ 16 декабря 2008

Вы захотите исследовать -[UIView addSubview:] и -[UIView removeFromSuperview]. Ваше базовое окно - UIView (потомок), поэтому вы можете добавлять и удалять его представления.

0 голосов
/ 28 октября 2011

Этот совет упоминается в документации Apple , но это не имеет значения. Я изо всех сил пытался понять это, и это довольно просто.

Просто измените свойство rootViewController главного окна на любой контроллер представления, которому принадлежит иерархия представления, которую вы хотите отобразить. Это просто так. Как только свойство обновляется, все содержимое окна изменяется на содержимое нового представления.

0 голосов
/ 12 октября 2010

Вы можете использовать следующий подход:

BaseView.h - все другие представления наследуются от этого представления:

@interface BaseView : UIView {}
@property (nonatomic, assign) UIViewController *parentViewController;
@end

BaseView.m

@implementation BaseView
@synthesize parentViewController;

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Initialization code
    }
    return self;
}

- (void)dealloc {
    [self setParentViewController:nil];
    [super dealloc];
}

@end

Другие представления могут наследоваться от BaseView. Их код должен быть примерно таким:

@implementation FirstView

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        [self setBackgroundColor:[UIColor yellowColor]];

        UIButton *button1 = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 200.0f, 30.0f)];
        [button1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button1 setBackgroundColor:[UIColor whiteColor]];
        [button1 setCenter:CGPointMake(160.0f, 360.0f)];
        [button1 setTitle:@"Show Second View" forState:UIControlStateNormal];
        [button1 addTarget:self action:@selector(switchView:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button1];
        [button1 release];      

        UIButton *button2 = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 200.0f, 30.0f)];
        [button2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button2 setBackgroundColor:[UIColor whiteColor]];
        [button2 setCenter:CGPointMake(160.0f, 120.0f)];
        [button2 setTitle:@"Show Sub View" forState:UIControlStateNormal];
        [button2 addTarget:self action:@selector(showView:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button2];
        [button2 release];              
    }

    return self;
}

- (void)showView:(id)sender {
    if (viewController == nil) {
        viewController = [[SubViewController alloc] initWithNibName:nil bundle:nil];        
    }

    [self addSubview:viewController.view];
}

- (void)switchView:(id)sender {
    SecondView *secondView = [[SecondView alloc] initWithFrame:self.frame];
    [self.parentViewController performSelector:@selector(switchView:) withObject:secondView];
    [secondView release];
}

- (void)dealloc {
    [viewController release];
    [super dealloc];
}

@end

Наконец, вам понадобится 1 UIViewController для всех представлений. SwitchView: метод будет вызван, чтобы изменить текущий вид. Код для UIViewController может выглядеть примерно так:

@implementation ViewController

- (void)loadView {
    FirstView *firstView = [[FirstView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)];    
    [firstView setParentViewController:self];
    [self setView:firstView];
    [firstView release];
}

- (void)switchView:(BaseView *)newView {
    [newView setParentViewController:self];
    [self retain];
    [self setView:newView];
    [self release];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    [super viewDidUnload];
}  

- (void)dealloc {
    [super dealloc];
}

@end

Вы можете скачать пример приложения здесь (в течение следующего часа): http://dl.dropbox.com/u/6487838/ViewSwitch.zip

0 голосов
/ 26 февраля 2009

NavBarDemo интересен, но, в конце концов, modalView - это просто еще одно представление, которое выталкивается и выталкивается из стека, насколько я могу судить.

А как насчет случаев, таких как приложение карт, когда вид карты переключается на вид таблицы со списком параметров поиска, когда пользователь начинает вводить адрес? Оба эти представления уже инициализированы при запуске, а представление таблицы результатов поиска просто установлено на видимость 0, а при вводе переключается на 1 или фактически загружается при событии touchUpInside текстового поля?

Я попробую возиться с UIView addSubview, чтобы воссоздать это действие и опубликовать свои результаты

0 голосов
/ 17 декабря 2008

Я нашел пример программы, которая использует ModalView для отображения видов, не вкладывая их как NavigatorControlView.

iPhone Nav Bar Demo

Пример ссылки выше, использует modalView для информационной ссылки. А также использует навигационные ссылки для ссылок табличного представления.

0 голосов
/ 16 декабря 2008

Как насчет добавления универсального UIView в UINavigationController?

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

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