在 Cocoa Touch 中以编程方式切换视图

Programmatically Switching Views in Cocoa Touch

提问人:Akusete 提问时间:12/16/2008 最后编辑:CœurAkusete 更新时间:1/21/2019 访问量:6545

问:

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

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

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

我还没有看到任何尝试执行此操作的示例,并且我似乎对 UIViewController/UIView 对象之间的关系和初始化过程了解不够,无法以编程方式实现此目的。

iOS Objective-C iPhone Cocoa-Touch

评论

0赞 JamesSugrue 12/16/2008
好问题。也一直在寻找这个答案

答:

0赞 Bill Heyman 12/16/2008 #1

如何将通用 UIView 推送到 UINavigationController 中?

如果要显示一个特定视图,只需将其作为子视图添加到之前推送的 UIView 即可。如果要更改视图,请删除以前的子视图并添加新的子视图。

评论

0赞 Akusete 12/16/2008
是否可以在没有顶部的导航视图栏的情况下执行此操作?如果可能的话,我希望能够只使用一个标准的 UIView 对象来做到这一点。
3赞 Ben Gottlieb 12/16/2008 #2

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

评论

0赞 Akusete 12/16/2008
我一定遗漏了一些东西,因为每当我尝试使用该方法时,我都会遇到运行时异常。我会继续阅读。
8赞 davidavr 12/16/2008 #3

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

[[self parentViewController] dismissModalViewControllerAnimated:YES];

评论

1赞 Akusete 12/16/2008
实际上,我只是找到了一个这样做的例子,并且正在回答我自己的问题。谢谢。
0赞 Eliot 9/10/2021
我喜欢这个解决方案的简单性,如果你只需要一个模态。此方法现已弃用,但您可以改用。presentViewController: animated: completion:
0赞 Akusete 12/17/2008 #4

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

iPhone 导航栏演示

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

0赞 Andy 2/26/2009 #5

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

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

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

0赞 Wolfgang Schreurs 10/12/2010 #6

您可以使用以下方法:

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赞 Ronaldo Faria Lima 10/29/2011 #7

这个提示在苹果的文档上说过,但没有给予重视。我发现自己很难理解它,而且非常简单。

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