如何将多个自定义视图控制器与导航控制器一起使用?
Posted
技术标签:
【中文标题】如何将多个自定义视图控制器与导航控制器一起使用?【英文标题】:How to use multiple custom View Controllers with a Navigation Controller? 【发布时间】:2011-09-04 02:48:55 【问题描述】:基本上,我在 MainWindow.xib 中有两个视图控制器,可以通过单击导航控制器中的条形按钮来查看它们。我希望将这两个视图控制器与 MainWindow.xib 分开,并使用它们自己的头文件、实现和 xib 文件,并且仍然使 MainWindow.xib 内的导航控制器在其中工作。
为了更好的理解,请看下面的代码:
非常感谢!
TestAppDelegate.h
#import <UIKit/UIKit.h>
@interface TestAppDelegate : NSObject <UIApplicationDelegate>
//Navigation Controller
IBOutlet UINavigationController *navigationController;
//View Controllers
UIViewController *viewController;
UIViewController *viewController2;
UIViewController *viewController3;
@property (nonatomic, retain) IBOutlet UIWindow *window;
//Navigation Controller
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
//View Controllers
@property (nonatomic, retain) IBOutlet UIViewController *viewController;
@property (nonatomic, retain) IBOutlet UIViewController *viewController2;
@property (nonatomic, retain) IBOutlet UIViewController *viewController3;
- (IBAction)next;
- (IBAction)next2;
@end
TestAppDelegate.m
#import "TestAppDelegate.h"
@implementation TestAppDelegate
@synthesize window = _window;
//Navigation Controller
@synthesize navigationController;
//View Controllers
@synthesize viewController;
@synthesize viewController2;
@synthesize viewController3;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
//Navigation Controller
[self.window addSubview:[navigationController view]];
[self.window makeKeyAndVisible];
return YES;
- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
- (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application
- (void)applicationWillTerminate:(UIApplication *)application
- (void)dealloc
[viewController release];
[viewController2 release];
[viewController3 release];
[navigationController release];
[_window release];
[super dealloc];
- (IBAction)next
[navigationController pushViewController:viewController2 animated:YES];
- (IBAction)next2
[navigationController pushViewController:viewController3 animated:YES];
@end
MainWindow.xib 内部:
http://i52.tinypic.com/10xa45f.png
【问题讨论】:
【参考方案1】:我通常不碰MainWindow.xib
。我建议如下:
通过转到File > New > New File
,创建一个MainController
,这将是您的子类UIViewController
的MainView。这将为每个 ViewController 创建一个 .h/.m 和 nib 文件。在那里为您的应用添加您想要的任何 UI。例如,添加两个按钮并将这些按钮连接到 MainController 中的 IBActions
。这应该分别在您的MainController.h/m
中声明和实施。
之后创建另外两个 ViewController,方法相同。
这些 IBAction 的主体应该创建一个 ViewController 的实例,然后推送它们。
看起来像这样:
YourViewController *yvc = [[YourViewController alloc] init];
[self.navigationController pushViewController:yvc animated:YES];
[yvc release];
最后,您必须将 MainController 推入您的 AppDelegate
并将您的 NavigationController
添加到视图中。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
MainViewController *mvc = [[MainViewController alloc] init];
UINavigationController *unvc = [[UINavigationController alloc] init];
[unvc pushViewController:mvc animated:NO];
[mvc release];
[self.window addSubview:unvc.view];
[self.window makeKeyAndVisible];
return YES;
【讨论】:
哈哈。我中间回答了 5 分钟,最后发布了与 Can 提供的相同方法。对此感到抱歉。 没关系。我很欣赏你的cmets。非常感谢! :D 嗨。创建了两个新的视图控制器后,我将在上面的 TestAppDelegate.h 和 TestAppDelegate.m 中创建什么代码?另外,我将把您在上面创建的 IBActions 代码放在哪里?我是在 TestAppDelegate.m 中编辑代码还是将其放入我的两个新视图控制器的实现文件中? 我将编辑我的答案,为您提供更多信息。另外我建议你看看这个question我为初学者 iPhone 开发者发布了一个很好的资源。 另外,这个project 是您想要达到的目标的一个很好的例子。【参考方案2】:将 Interface Builder 中的“class”属性(检查器中的第三个选项卡,“Custom Class”)设置为您计划使用的自定义类的名称,然后输入名称您要从“NIB 名称”(第四个选项卡)中加载的 .xib 文件的名称。
您用来推送 viewController 的代码没问题。确保永远不要意外地释放两个 UIViewController 中的任何一个。
说到这一点,请记住,这种方法将 ViewControllers 始终保留在内存中,即使在不使用时也是如此。另一种方法是完全删除两个 ViewController 的 IBOutlets,并执行以下操作:
- (IBAction)next
MyCustomViewController *customViewController = [[MyCustomViewController alloc] initWithNibName:<#NibName or nil#> bundle:[NSBundle mainBundle]];
[navigationController pushViewController:customViewController animated:YES];
[customViewController release];
这会在需要时创建对象(如果我没记错的话,来自 xib 的 UI 元素被缓存在某处,因此这可能无关紧要[需要引用])。只是需要记住的一点,这取决于您的两个 ViewController 的使用频率。
【讨论】:
非常感谢 Can!我很感激!我将尝试在我的应用程序中实现这一点。 :D 嗨。我似乎无法让它工作。 :( 是否可以给我一个完整项目的链接,或者如果你能找到一个很好的教程供我阅读,你能把它贴在这里吗?谢谢!以上是关于如何将多个自定义视图控制器与导航控制器一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建导航控制器以将主视图控制器连接到 2 个自定义视图控制器
如何在所有视图控制器中将自定义 uibarbuttonItem 添加到我的导航项?
UIViewController & UIview dealloc 没有被调用
与自定义视图控制器一起使用时,UINavigationBar 的 UIAppearance 不起作用...?