【问题标题】:Load different initial view based on application preferences?根据应用程序偏好加载不同的初始视图?
【发布时间】:2011-02-27 19:03:04
【问题描述】:

我有一个偏好,当设置时,它会强制我的应用程序在启动时执行一些同步。

我可以使用 IB 根据此设置显示不同的初始视图吗?

是否有启用此行为的标准方法?

【问题讨论】:

    标签: iphone cocoa-touch xcode uiviewcontroller interface-builder


    【解决方案1】:

    假设您在同步期间设置了应用委托的属性,在初始视图控制器的 initWithNibNamed: 方法中检查应用委托同步的值并通过调用 [super initWithNibNamed:@"thisNibInsteadOfThatNib"]; 加载适当的 nib

    编辑:显示代码以根据启动时的某些条件启动不同的视图

    // AppDelegate.h
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : NSObject <UIApplicationDelegate>
    {
        UIWindow *window;
        UIViewController *firstViewController;
    }
    @property {nonatomic, retain} UIWindow *window;
    @end
    
    // AppDelegate.m
    #import AppDelegate.h
    #import ViewControllerOne.h
    #import ViewControllerTwo.h
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        BOOL shouldLoadViewOne = \\ some value from preferences
    
        if (shouldLoadViewOne) {
            firstViewController = [[ViewOneController alloc] initWithNibName:@"ViewOneController" bundle:nil];
        } else {
            firstViewController = [[ViewTwoController alloc] initWithNibName:@"ViewTwoController" bundle:nil];
        }
    
        UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
    
        [window addSubView:[navController view]];
    
        [window makeKeyAndVisible];
    
        return YES;
    }
    

    编辑 2:

    使用NSClassFromSting() 并保存 firstViewController 的名称以加载到首选项中。

    // AppDelegate.h
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : NSObject <UIApplicationDelegate>
    {
        UIWindow *window;
        id firstViewController;
    }
    @property {nonatomic, retain} UIWindow *window;
    
    - (NSString *)firstViewControllerName;
    
    @end
    
    // AppDelegate.m
    #import AppDelegate.h
    #import ViewControllerOne.h
    #import ViewControllerTwo.h
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        NSString *viewControllerName = [self firstViewControllerName];
    
        firstViewController = [[NSClassFromString(viewControllerName) alloc] initWithNibName:viewControllerName  bundle:nil];
    
        UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
    
        [window addSubView:[navController view]];
    
        [window makeKeyAndVisible];
    
        return YES;
    }
    
    - (NSString *)firstViewControllerName
    {
        NSString *defaultViewController = @"ViewOneController";
        NSString *savedFirstViewController = // string retrieved from preferences or other persistent store
    
        if (!savedFirstViewController)
            return defaultViewController;
    
        return savedFirstViewController;
    }
    

    【讨论】:

    • 或者,如果每个 nib (ViewOneController、ViewTwoController) 有不同的视图控制器,则根据 applicationDidFinishLaunching: 中的同步条件初始化控制器或需要加载的视图
    • 当然这假设这不是一个“国际化”问题,如果您根据 Apple 文档创建必要的 nib 文件,则会在运行时自动处理
    • 你能详细说明初始化'didFinishLaunchingWithOptions:'吗?
    • 更新了答案以显示根据某些条件加载不同的 rootView。
    • 谢谢。这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2013-12-11
    相关资源
    最近更新 更多