Ios 如何从窗口加载和卸载UIViewController
我在加载应用程序时创建了一些逻辑,根据我在plist中设置的一些值,我可以从3个不同的视图加载这些逻辑 这就是我的代码的样子Ios 如何从窗口加载和卸载UIViewController,ios,objective-c,uiview,uiviewcontroller,Ios,Objective C,Uiview,Uiviewcontroller,我在加载应用程序时创建了一些逻辑,根据我在plist中设置的一些值,我可以从3个不同的视图加载这些逻辑 这就是我的代码的样子 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //sets context for coredata CoreDataController *coreDataController
- (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;
}
我希望能够加载和卸载UIViewController(包括使用按钮等从内存中删除)
我不想使用基于navigaiton的控制器,因为我希望视图是静态的或单独的,如果这样更有意义的话
如果有人能给我看一些示例代码,将新的UIViewController加载到窗口并删除旧的UIViewController,我会非常感激
然而,我不确定处理这个问题的正确方法,甚至不确定代码的外观
任何帮助都将不胜感激。对我来说,这样加载您的视图不是一个好方法。 最好在AppDelegate中加载一个rootViewController,并根据
rootViewController
中的plist添加当前视图:
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;
}
在RootViewController
中,根据plist添加当前视图的子视图后:
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];
}
}
您确实应该考虑使用导航控制器来处理应用程序中的导航。这些将确保您的VIEW控制器的LoopVIEW EN卸载视图将被自动调用。我无法想象这是正确的另一种方式。按钮可以用来将这些视图控制器推到导航控制器上。创建到视图的导航。我同意@TotumusMaximus。我认为最好的方法是在主窗口中安装一个rootViewController,并使用导航控制器推送其他视图。看看这里,我倾向于同意你们的观点,但这不是一个以导航为中心的应用程序。有3个视图在任何一个time。因此,应用程序代理能够加载3个ViewController中的任何一个作为第一个/rootvew。我将很快为不带导航控制器的用户添加答案;)