Программное переключение представлений в Cocoa Touch

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

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

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

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

15.12.2008 23:23:43
Хороший вопрос искал этот ответ тоже
JamesSugrue 15.12.2008 23:28:20
7 ОТВЕТОВ
РЕШЕНИЕ

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

[[self parentViewController] dismissModalViewControllerAnimated:YES];
8
16.12.2008 03:29:18
Я на самом деле только что нашел пример, делающий именно это, и собирался ответить на свой вопрос. Спасибо.
Akusete 16.12.2008 06:08:19

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

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

0
16.12.2008 00:08:04
Возможно ли это сделать без панели навигации сверху? Если возможно, я хочу сделать это с помощью стандартного объекта UIView.
Akusete 16.12.2008 01:29:04

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

3
25.12.2012 15:10:20
Я должен что-то упустить, потому что всякий раз, когда я пытаюсь использовать этот метод, я получаю исключения во время выполнения. Я продолжу читать.
Akusete 16.12.2008 06:09:55

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

iPhone Nav Bar Демо

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

0
17.12.2008 00:30:36

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

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

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

0
26.02.2009 14:37:29

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

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
12.10.2010 08:02:44

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

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

0
28.10.2011 19:13:20