【问题标题】: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

【问题讨论】:

    标签: iphone ios xcode uiviewcontroller uinavigationcontroller


    【解决方案1】:

    我通常不碰MainWindow.xib。我建议如下:

    1. 通过转到File &gt; New &gt; New File,创建一个MainController,这将是您的子类UIViewController 的MainView。这将为每个 ViewController 创建一个 .h/.m 和 nib 文件。在那里为您的应用添加您想要的任何 UI。例如,添加两个按钮并将这些按钮连接到 MainController 中的 IBActions。这应该分别在您的MainController.{h/m} 中声明和实施。

    2. 之后创建另外两个 ViewController,方法相同。

    3. 这些 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
    • 嗨。我似乎无法让它工作。 :( 是否可以给我一个完整项目的链接,或者如果你能找到一个很好的教程供我阅读,你能把它贴在这里吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 2020-08-08
    • 1970-01-01
    • 2014-10-10
    • 2011-10-12
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多