【问题标题】:MMDrawerController and instantiating many view controllersMMDrawerController 和实例化许多视图控制器
【发布时间】:2014-08-26 02:37:28
【问题描述】:

这是一个特定的 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];
        }

我们将不胜感激有关加载这些视图控制器的最佳方法的想法/cmets。

【问题讨论】:

    标签: ios objective-c viewcontroller


    【解决方案1】:

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

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

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2014-11-07
      • 1970-01-01
      相关资源
      最近更新 更多