Управление несколькими ViewControllers из TableView - PullRequest
0 голосов
/ 28 июня 2011

Мне любопытно, есть ли у кого-нибудь идеи по управлению несколькими ViewControllers из TableView. У меня есть список примерно из семи элементов, которые я отображаю в TableView с ViewController, посвященным каждому. Моя первая мысль - инициализировать массив различными ViewControllers.

NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithCapacity:7];
[viewControllers addObject:[[ViewController1 alloc] initWithNibName:@"View1" bundle:nil]];
[viewControllers addObject:[[ViewController2 alloc] initWithNibName:@"View2" bundle:nil]];
...

Затем ссылка на этот массив для загрузки соответствующего представления при выборе элемента.

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [self.navigationController pushViewController:[viewControllers objectAtIndex:indexPath.row] animated:YES];
}

Я действительно не уверен, что это подходящий подход. Любое направление было бы замечательно.

РЕДАКТИРОВАНИЕ:

Основываясь на отзывах Райана и Джо, я реализовал объект для хранения элементов таблицы. Сокращение моей проблемы также вызвало некоторую путаницу в деталях реализации. Добавлено полное решение для управления обоими контроллерами представления и выбора элементов панели вкладок.

TableNavigationItem.h

#import 


@interface TableNavigationItem : NSObject {
    NSString *title;
    NSNumber *tabIndex;
    id viewController;
}

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSNumber *tabIndex;
@property (nonatomic, retain) id viewController;

@end

TableNavigationItem.m

#import "TableNavigationItem.h"


@implementation TableNavigationItem

@synthesize title;
@synthesize viewController;

- (id) init{

    if(self = [super init]){
        self.title = @"";
    }

    return self;
}

- (void) dealloc {
    [title release];
    [tabIndex release];
    [viewController release];
    [super dealloc];
}

@end

Затем инициализируйте согласно предложению Джо.

NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:7];
TableNavigationItem *navItem;

// view 1
navItem = [[TableNavigationItem alloc] init];
navItem.title = @"View 1";
navItem.tabIndex = [NSNumber numberWithInt:1];
[mutableArray addObject:navItem];
[navItem release];

// view 2
navItem = [[TableNavigationItem alloc] init];
navItem.title = @"View 2";
navItem.viewController = [ViewController2 class]];
[mutableArray addObject:navItem];
[navItem release];

...

// store the navigation items
self.tableItems = [NSArray arrayWithArray:mutableArray];
[mutableArray release];

Тогда

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    TableNavigationItem *navItem = [tableItems objectAtIndex:indexPath.row];
    if(navItem.viewController != nil){
        [self.navigationController pushViewController:[[[navItem.viewController alloc] init] autorelease] animated:YES];
    }
    else if(navItem.tabIndex != nil){
        [((MyAppDelegate *)[UIApplication sharedApplication].delegate).tabBarController setSelectedIndex:[navItem.tabIndex integerValue]];
    }
}

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Если все виды, которыми управляют эти контроллеры, сразу видны на экране, в этом подходе нет ничего плохого.Убедитесь, что вы освободили массив VC в -viewDidUnload и воссоздали его в -viewDidLoad, чтобы среда выполнения могла выгрузить все эти дополнительные объекты, когда на экран будет выведено следующее представление.И имейте в виду, только корневой контроллер представления будет получать события жизненного цикла представления;Контроллеры представлений, которые вы создаете и добавляете в таблицу собственные представления, не будут вызывать эти методы.Вам нужно будет реализовать некоторую систему слежения, чтобы эти события жизненного цикла представления отображались в «подпредставлениях» через уведомление или делегирование.

Лучший ответ на ваш вопрос - «Инструмент это».Как минимум запустите инструменты Allocations и VM и проверьте, сколько памяти занимают эти контроллеры представления.Если вы хотите улучшить свои навыки с помощью Instruments, посмотрите сеанс Performance из WWDC 2011, они отлично поработали, научив его использовать для поиска проблем с памятью и производительностью.

1 голос
/ 28 июня 2011

Это звучит хорошо для меня.Единственное, что меня беспокоит, так это то, что ваши контроллеры представлений перегружены оперативной памятью, и в этом случае вы можете принять решение: лучше ли заранее распределить все (то есть вы уверены, что можете соответствовать состоянию всех этих контроллеров в пределах доступной памяти??) или лучше принять задержку, чтобы загрузить соответствующий контроллер представления по мере необходимости?

Похоже, что ваши ViewControllers принадлежат к разным классам.Если это так (и каждый из них всегда использует один и тот же соответствующий перо), я бы подумал о реализации пользовательского метода -init для каждого из них и превращении вашего массива выбора в один из Class объектов.Однако это всего лишь вопрос личных предпочтений.

Еще одна вещь: вы захотите автоматически выпустить эти контроллеры представления, или вы потеряете память, несмотря ни на что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...