Как оптимизировать производительность при просмотре контроллера представления с помощью UISegmentedControl и UITabBarController - PullRequest
1 голос
/ 27 июля 2011

В проекте, над которым я работаю, проектным решением было использование UISegmentControl вверху, а UITabBarController внизу. UISegmentControl имеет 3 варианта для 3 различных представлений. В настоящее время мой коллега добавил все 3 представления в NSArray, когда выбрана эта конкретная вкладка, а затем на основе UISegmentControl выбранное представление становится скрытым, а два других скрыты. Похоже, что он не следует рекомендациям Apple относительно отложенной загрузки и кажется дорогостоящим, поскольку 3 viewDidLoads (где запросы выполняются к базе данных) загружаются все сразу. Из-за этого возникает некоторая задержка, когда вкладка выбирается впервые, загружая все 3 viewControllers одновременно.

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

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Я бы предложил создать контроллер корневого представления, задачей которого является управление сегментным элементом управления и загрузка соответствующего VC в зависимости от того, какая кнопка в сегментном элементе управления выбрана. Представление корневого VC будет иметь подпредставление, в которое вставляются представления VC сегментированного элемента управления. Что-то вроде:

- (void)segmentAction:(id)sender
{
    NSParameterAssert([sender isKindOfClass: [UISegmentedControl class]]);
    switch ([sender selectedSegmentIndex]) {
        case 0:
            MYViewController1 *vc = [[MyViewController1 alloc] init];
            self.segmentVC = vc;
            self.segmentSubvew = vc.view;
            [vc release];
            break;
    }
}

Одна вещь, за которую люди склонны зацикливаться, - это то, что для каждого экрана контента должен быть только 1 VC - хотя это изначально было то, что было рекомендовано Apple, они с тех пор изменили эту рекомендацию. Таким образом, загрузка VC для вашего сегмента в SegmentManagerVC вполне приемлема.

Вы можете дополнительно настроить этот дизайн для повышения производительности. Например, вы могли изначально загрузить VC для выбранного сегмента по умолчанию, а затем лениво загрузить другие два, чтобы они уже были доступны, когда выбран другой сегмент. Однако если вы воспользуетесь этим подходом, обязательно подключите -didReceiveMemoryWarning, чтобы освободить два виртуальных канала, которые в данный момент не просматриваются.

0 голосов
/ 27 июля 2011

Вы можете помещать / вставлять представления в стек UINavigationControler. Это также будет поддерживать кнопку «назад», если вы этого хотите.

    [self.navigationController pushViewController:self.myVC animated:YES];

Свяжите метод с SegmentedControl, который выдвигает соответствующий ViewController при выборе соответствующего сегмента. VC с вашим сегментированным элементом управления внутри него потребуется ссылка на соответствующий VC каждого сегмента. viewDidLoad() будет вызываться только один раз и только тогда, когда представление впервые помещается в стек навигации.

Когда вы меняете представления или хотите вернуться назад, вы можете вытолкнуть ВК из стека:

[self.navigationController popViewControllerAnimated:YES];

Это тот тип функциональности, который вы искали?


Редактировать для Ясность

UIViewController Ссылки:

Каждому представлению потребуется ссылка на два других ViewController. Это можно сделать так: (предположим, что мы находимся в «View1», и у нас также есть «View2» и «View3»:

    View2Controller v2Controller = [[View2Controller alloc] initWithNibName:@"View2" bundle:nil];
    View3Controller v2Controller = [[View3Controller alloc] initWithNibName:@"View3" bundle:nil];

Ссылка на self.navigationController должна быть объявлена ​​в делегате вашего приложения как:

UINavigationController* navigationController;

Может быть инициализировано как:

[navigationController initWithRootViewController: rootViewController];

RootViewController

rootViewController - это UIViewController, который соответствует корневому представлению вашего приложения (независимо от загрузки при запуске). Он объявлен в делегате как:

RootViewController* rootViewController;

И инициализируется как:

    rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...