提问人:Akusete 提问时间:12/16/2008 最后编辑:CœurAkusete 更新时间:1/21/2019 访问量:6545
在 Cocoa Touch 中以编程方式切换视图
Programmatically Switching Views in Cocoa Touch
问:
如何在 iPhone 应用程序中以编程方式更改屏幕上的视图?
我已经能够创建导航视图并以编程方式推送/弹出它们以产生这种行为,但是如果我想简单地更改当前视图(不使用 UINavigation 控制器对象),实现此目的的最简洁方法是什么?
举个简单的例子,想象一个带有单个按钮的应用程序,当按下时将显示一个新视图,或者可能是多个视图中的一个,具体取决于某些内部状态变量。
我还没有看到任何尝试执行此操作的示例,并且我似乎对 UIViewController/UIView 对象之间的关系和初始化过程了解不够,无法以编程方式实现此目的。
答:
如何将通用 UIView 推送到 UINavigationController 中?
如果要显示一个特定视图,只需将其作为子视图添加到之前推送的 UIView 即可。如果要更改视图,请删除以前的子视图并添加新的子视图。
评论
你会想要探索和.基础窗口是(后代),因此可以向其添加和删除视图。-[UIView addSubview:]
-[UIView removeFromSuperview]
UIView
评论
我曾经从主窗口调出一个设置视图,然后当用户在设置视图中按“完成”时,我从设置视图调用(回到父视图),如下所示:presentModalViewController:animated:
UIViewController
dismissModalViewControllerAnimated:
[[self parentViewController] dismissModalViewControllerAnimated:YES];
评论
presentViewController: animated: completion:
我找到了一个示例程序,它使用 ModalView 来显示视图,而无需将它们嵌套为 NavigatorControlView 的视图。
上面的示例链接使用 modalView 作为信息链接。并且还使用导航链接作为表视图链接。
NavBarDemo 很有趣,但最终,modalView 只是另一个被推送和弹出堆栈的视图,据我所知。
像地图应用程序这样的情况,当用户开始输入地址时,地图视图切换到列出搜索选项的表视图,情况如何?这两个视图是否在启动时都已启动,并且搜索结果表视图仅设置为可见性 0,当您键入时,它已切换为 1,或者它是否实际加载到文本字段的 touchUpInside 事件中?
我将尝试弄乱 UIView addSubview 以重新创建此操作并发布我的结果
您可以使用以下方法:
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
这个提示在苹果的文档上说过,但没有给予重视。我发现自己很难理解它,而且非常简单。
只需将主窗口的 rootViewController 属性更改为拥有要显示的视图层次结构的任何视图控制器即可。就这么简单。更新属性后,整个窗口内容将更改为新视图的内容。
评论