7

如何在 iPhone 应用程序中以编程方式更改屏幕上的视图?

我已经能够创建导航视图并以编程方式推送/弹出它们以产生这种行为,但是如果我想简单地更改当前视图(不使用 UINavigation 控制器对象),实现这一目标的最巧妙方法是什么?

一个简单的例子,想象一个有一个按钮的应用程序,当按下时会显示一个新的视图,或者可能是多个视图之一,这取决于一些内部状态变量。

我还没有看到任何尝试这样做的示例,而且我似乎对 UIViewController/UIView 对象之间的关系和初始化过程了解不够,无法以编程方式实现这一点。

4

7 回答 7

8

我用来presentModalViewController:animated:从我的主窗口调出一个设置视图UIViewController,然后当用户在设置视图中按下“完成”时,我dismissModalViewControllerAnimated:从设置视图调用(返回到父视图),如下所示:

[[self parentViewController] dismissModalViewControllerAnimated:YES];
于 2008-12-16T03:29:18.923 回答
3

你会想要探索-[UIView addSubview:]-[UIView removeFromSuperview]。您的基本窗口是一个UIView(后代),因此您可以向其添加和删除视图。

于 2008-12-16T00:10:33.503 回答
0

将通用 UIView 推入 UINavigationController 怎么样?

当您想要显示一个特定视图时,只需将其作为子视图添加到先前推送的 UIView。当您想更改视图时,请删除以前的子视图并添加新的子视图。

于 2008-12-16T00:08:04.680 回答
0

我找到了一个示例程序,它使用 ModalView 来显示视图而不将它们嵌套为 NavigatorControlView。

iPhone 导航栏演示

上面的示例链接使用 modalView 作为信息链接。并且还使用导航链接作为表格视图链接。

于 2008-12-17T00:30:36.490 回答
0

NavBarDemo 很有趣,但最后,据我所知,modalView 只是另一个视图被推送和弹出堆栈。

像地图应用程序这样的情况,当用户开始输入地址时,地图视图会切换到列出搜索选项的表格视图?这两个视图是否已经在启动时初始化,并且搜索结果表视图刚刚设置为可见性 0,当您键入时,它切换到 1,或者它实际上是在文本字段的 touchUpInside 事件上加载的?

我会尝试弄乱 UIView addSubview 以重新创建此操作并发布我的结果

于 2009-02-26T14:37:29.337 回答
0

您可以使用以下方法:

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

于 2010-10-12T08:02:44.313 回答
0

这个提示在Apple 的文档中有所提及,但并不重要。我发现自己很难理解它,而且它非常简单。

只需将主窗口的 rootViewController 属性更改为拥有您要显示的视图层次结构的任何视图控制器。就这么简单。一旦更新了属性,整个窗口内容就会更改为新视图的内容。

于 2011-10-28T19:13:20.257 回答