以编程方式切换自定义视图(推送和弹出)
Posted
技术标签:
【中文标题】以编程方式切换自定义视图(推送和弹出)【英文标题】:Switching custom views programmatically (pushing and popping) 【发布时间】:2011-08-09 18:16:07 【问题描述】:在 ios 中,我的视图单独工作,但我无法在它们之间切换。
现在经过大量谷歌搜索后,我喜欢基于导航的应用程序可以很好地与视图堆栈配合使用。问题是我所有的观点都是在源代码中定制的 nib/xib-less 和定制的。因此,我需要自己的 UINavigationController 并手动/代码推送和弹出视图。因为每个教程要么是 nib/xib 和 IB 绑定的,要么只是一堆代码 sn-ps,我需要一个具体的例子来做。
一个简单的示例,其中包含 2 个以编程方式创建的视图(可以为空,只需使用 loadView 而不是使用 nib/xib 进行初始化)和一个工作堆栈(推送和弹出视图,例如:加载应用程序,创建一些根如果需要查看,推送一个视图,然后从该视图推送第二个视图,然后弹出它们)会很棒,或者至少是一个包含整个项目源代码而不是 sn-ps 的教程。
提前致谢。
编辑:经过一些额外的思考,再澄清一点也不错。我的应用程序基本上由 5 或 6 个视图组成,这些视图将被称为它们各自先前的视图,即向下钻取应用程序。
【问题讨论】:
我不明白。我也有几个视图,我需要以编程方式切换它们。所有教程都是用 .xib/.nib 文件完成的。因此,我刚刚完成了第五个小时的示例搜索。我已经阅读了文档,但这对我来说还不够。我发现并帮助我的最后一件事是 youtube Grrr 上的 video。 【参考方案1】:这里有一个简短的代码,只有基本部分:
CodeViewsPushingAppDelegate.m
#import "CodeViewsPushingAppDelegate.h"
#import "ViewNumberOne.h"
@implementation CodeViewsPushingAppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
UINavigationController *navController = [[UINavigationController alloc] init];
ViewNumberOne *view1 = [[ViewNumberOne alloc] init];
[navController pushViewController:view1 animated:NO];
[self.window addSubview:navController.view];
[self.window makeKeyAndVisible];
return YES;
ViewNumberOne.h
#import <UIKit/UIKit.h>
@interface ViewNumberOne : UIViewController
UIButton *button;
- (void)pushAnotherView;
@end
ViewNumberOne.m
#import "ViewNumberOne.h"
#import "ViewNumberTwo.h"
@implementation ViewNumberOne
- (void)loadView
[super loadView];
button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(110, 190, 100, 20);
[button setTitle:@"Push Me!" forState:UIControlStateNormal];
[button addTarget:self action:@selector(pushAnotherView) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
- (void)pushAnotherView;
ViewNumberTwo *view2 = [[ViewNumberTwo alloc] init];
[self.navigationController pushViewController:view2 animated:YES];
[view2 release];
ViewNumberTwo.h
#import <UIKit/UIKit.h>
@interface ViewNumberTwo : UIViewController
UILabel *label;
@end
ViewNumberTwo.m
#import "ViewNumberTwo.h"
@implementation ViewNumberTwo
- (void)loadView
[super loadView];
label = [[UILabel alloc] init];
label.text = @"I am a label! This is view #2";
label.numberOfLines = 2;
label.textAlignment = UITextAlignmentCenter;
label.frame = CGRectMake(50, 50, 200, 200); //whatever
[self.view addSubview:label];
【讨论】:
像魅力一样工作,希望其他人也能从中受益。 乐于帮助 :) 毕竟,除了初始化(您调用 init 并实现 loadView 而不是 initWithXib )之外,它完全相同。不过,我建议使用 xibs - 它消耗资源更少、速度更快、更容易更改和本地化。 感谢您的信息,但我的观点将是动态的,所以 xib 是毫无疑问的,无论如何,我知道这并不难,我正在搞乱基于导航的模板,但就是无法制作它可以工作,切换到基于空白窗口的窗口,然后总是缺少某些东西。谢谢;) @Niv ViewNumberOne 和 ViewNumberTwo 是如何获得navigationController
属性的?在方法- (void)pushAnotherView;
中有一行[self.navigationController pushViewController:view2 animated:YES];
。您是否创建了指向导航控制器的指针,然后在初始化期间或以其他方式将指针传递给导航控制器?我最初认为这是代理的工作UINavigationControllerDelegate
但不,这个类别用于启用对当前加载视图的额外控制。以上是关于以编程方式切换自定义视图(推送和弹出)的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义单元格中点击以编程方式添加的 UiImageViews 推送新视图
以编程方式创建的 UINavigationController 推送和弹出问题