如何将多个自定义视图控制器与导航控制器一起使用?

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 &gt; New &gt; 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 不起作用...?

使用 UIPageViewController 使 UI 滚动视图滚动

使用导航呈现自定义大小的视图控制器