简体   繁体   English

如何从窗口加载和卸载UIViewController

[英]How to load and unload a UIViewController from the window

I have create some logic when the app is loaded that I can load from 3 different views depending on some values I set in my plist. 加载应用程序时,我已经创建了一些逻辑,可以根据在plist中设置的一些值从3个不同的视图中加载。

This is what my code looks like 这就是我的代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    //sets context for coredata
    CoreDataController *coreDataController = [CoreDataController sharedManager];
    coreDataController.managedObjectContext = self.managedObjectContext;

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    PrefsController *prefsController = [[PrefsController alloc] init];
    NSDictionary *prefsDictionary = [prefsController readPrefs];

    NSLog(@"%@", prefsDictionary);

    NSString *projectListBoolString = [prefsDictionary objectForKey:@"ProjectListAvailable"];
    NSString *installsBoolString = [prefsDictionary objectForKey:@"InstallsAvailable"];
    NSString *finishinBoolString = [prefsDictionary objectForKey:@"FinishingAvailable"];


    if (([projectListBoolString isEqualToString:@"T"]) && ([installsBoolString isEqualToString:@"F"]) && ([finishinBoolString isEqualToString:@"F"])) {
        self.getProjectListViewController = [[GetProjectListViewController alloc] initWithNibName:@"GetProjectListViewController" bundle:nil];
        self.window.rootViewController = self.getProjectListViewController;
        [self.window makeKeyAndVisible];
    }
    else if (([projectListBoolString isEqualToString:@"T"]) && ([installsBoolString isEqualToString:@"T"]) && ([finishinBoolString isEqualToString:@"T"])) {
        self.currentProjectListViewController = [[CurrentProjectListViewController alloc] initWithNibName:@"CurrentProjectListViewController" bundle:nil];
        self.window.rootViewController = self.currentProjectListViewController;
        [self.window makeKeyAndVisible];
    }
    else {
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
        self.window.rootViewController = self.viewController;
        [self.window makeKeyAndVisible];
    }

    return YES;
}

I would like to be able to then load and unload UIViewControllers (including removing from memory by using buttons presses etc. 我希望能够然后加载和卸载UIViewControllers(包括通过使用按键等从内存中删除)。

I dont want to use a navigaiton based controller as I want the views to be static or individual if that makes more sense. 我不想使用基于导航的控制器,因为如果这样更合理,我希望视图是静态的或独立的。

If someone could show me some example code to load a new UIViewController to the window and remove the old UIViewController that would be greatly apprecaited. 如果有人可以向我展示一些示例代码,以将新的UIViewController加载到窗口中并删除将不胜枚举的旧版UIViewController。

However I am not sure of the correct was to handle this, or even how the code looks. 但是我不确定是正确的,还是代码的外观。

any help would be greatly appreciated. 任何帮助将不胜感激。

For me, is not a good way to load your view like this. 对我来说,这不是加载您的视图的好方法。 It would be better to load a rootViewController in your AppDelegate and add your current view depending of your plist inside the RootViewController : 最好在AppDelegate中加载rootViewController并根据RootViewController中的plist添加当前视图:

AppDelegate AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    self.window.rootViewController = rootViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

After in your RootViewController add a subview of the current view depending on your plist : RootViewController之后,根据您的plist添加当前视图的子视图:

RootViewController.m RootViewController.m

#pragma mark - View management
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSDictionary *prefsDictionary = [prefsController readPrefs];

    NSLog(@"%@", prefsDictionary);

    NSString *projectListBoolString = [prefsDictionary objectForKey:@"ProjectListAvailable"];
    NSString *installsBoolString = [prefsDictionary objectForKey:@"InstallsAvailable"];
    NSString *finishinBoolString = [prefsDictionary objectForKey:@"FinishingAvailable"];

    if (([projectListBoolString isEqualToString:@"T"]) && ([installsBoolString isEqualToString:@"F"]) && ([finishinBoolString isEqualToString:@"F"])) {
        self.getProjectListViewController = [[GetProjectListViewController alloc] initWithNibName:@"GetProjectListViewController" bundle:nil];
        // Add View Controller
        [self.view addSubview:self.getProjectListViewController.view
    }
    else if (([projectListBoolString isEqualToString:@"T"]) && ([installsBoolString isEqualToString:@"T"]) && ([finishinBoolString isEqualToString:@"T"])) {
        self.currentProjectListViewController = [[CurrentProjectListViewController alloc] initWithNibName:@"CurrentProjectListViewController" bundle:nil];
        // Add View Controller
        [self.view addSubview:self.currentProjectListViewController.view];
    }
    else {
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
        // Add View Controller
        [self.view addSubview:self.viewController.view];
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM