MMDrawerController并实例化许多视图控制器

时间:2014-02-27 02:36:22

标签: ios objective-c viewcontroller

这是一个特定的MMDrawerController问题,虽然可能与其他iOS抽屉控制器有关。

我的MMDrawerController运行良好,可以通过在抽屉桌面视图中选择一行,将不同的视图控制器加载到“中心”。

但是,每次我在抽屉中选择一个菜单项时,我都希望避免实例化我的视图控制器。这似乎效率低下,特别是如果用户在会话期间多次在屏幕之间切换。我猜一个更好的方法是存储我实际使用的(实例化的)视图控制器作为变量并重用?我有很多视图控制器可能加载到中心,每个视图控制器最初都会在viewDidLoad中执行一些“工作”。

以下是我将新视图控制器加载到中心的方法(在我的DrawerViewController.didSelectRowAtIndexPath方法中):

MyViewConroller * newCenter = [[MyViewConroller alloc] init];

UINavigationController * nav = [[MMNavigationController alloc] initWithRootViewController:newCenter];

        if(indexPath.row==0){
            [self.mm_drawerController
             setCenterViewController:nav
             withCloseAnimation:YES
             completion:nil];
        }

关于加载这些视图控制器的最佳方法的想法/评论将不胜感激。

1 个答案:

答案 0 :(得分:5)

这种方法对我来说效果很好,每次用户更改视图时都不需要实例化新的视图控制器或导航控制器。

声明一个可变数组来保存导航控制器:

@property (nonatomic, strong) NSMutableArray *navigationControllerArray;

使用与视图控制器相同数量的空字符串初始化并填充数组:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationControllerArray = [[NSMutableArray alloc] initWithObjects:@"",@"",@"",nil];

}

在UITableViewDelegate中,检查所选行的对象是否为UINavigationController。如果不是,请实例化一个新的导航控制器并用它替换导航控制器阵列中的空字符串。

将此导航控制器设置为中央视图控制器:

#pragma mark - UITableViewDelegate

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSObject *navigationController = [self.viewControllerArray objectAtIndex:indexPath.row];

    if (![navigationController isKindOfClass:[UINavigationController class]]) {

        UIViewController *newViewController;

        switch (indexPath.row) {
            case 0:
                newViewController = (UIViewController *)[[AccountListTableViewController alloc] init];
                break;
            case 1:
                newViewController = (UIViewController *)[[PageDetailViewController alloc] init];
                break;
            case 2:
                newViewController = (UIViewController *)[[LoginViewController alloc] init];
                break;

            default:
                newViewController = (UIViewController *)[[AccountListTableViewController alloc] init];
                break;
        }

        navigationController = (UINavigationController *)[[UINavigationController alloc] initWithRootViewController:(UIViewController *)newViewController];

        [self.viewControllerArray replaceObjectAtIndex:indexPath.row withObject:navigationController];

    }

    [self.mm_drawerController setCenterViewController:(UINavigationController *)navigationController withCloseAnimation:YES completion:nil];

    return indexPath;
}