Почему мой вид исчезает при предупреждении о недостатке памяти? - PullRequest
0 голосов
/ 20 января 2011

Мое приложение имеет контроллер панели вкладок, один из элементов вкладки - контроллер разделенного представления.Его главный контроллер вида (т. Е. С индексом 0) является навигационным контроллером, загружаемым из пера, из-за его пользовательской навигационной панели.

Если это звучит немного неясно, то это всего лишь комбинация 1) невозможность добавить SVC в TBC в IB и 2) ошибка iOS 4.2 splitview-navbar-colorTint .И действительно, только после вчерашнего решения этой проблемы у меня возникла проблема с предупреждением о нехватке памяти.

До временного решения я устанавливал SVC с двумя контроллерами навигации и программно добавлял его в TBC (Из-за ограничений IB с панелью вкладок th) и без проблем - ну, за исключением этой ошибки Apple.

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

Но в моей адаптации обходного демо все начинает становиться грушевидным.Отправьте предупреждение о нехватке памяти, пока отображается разделенный вид, и вся левая сторона (основной вид) исчезает.Поведение идентично на устройстве, фактически я впервые обнаружил его там.

Я озадачен тем, что происходит.Представление на дисплее (корневое представление nav cont) управляется подклассом табличного представления.Я переопределил didReceiveMemoryWarning, но это не помогает.Кроме того (соответственно!), Супервизия не равна нулю.Это UITableView.Совершенно верно.

Итак, я думаю, что навигационный контроллер выпускается?Но где?А почему не в оригинальной демоверсии?Разница теперь в добавлении моего контроллера панели вкладок.Вот мой код, который добавляет его на панель вкладок:

- (void) addTabItemSplitViewWithNavConRoot:(BOOL)hasRootNC {

    // init master/detail views 
    SV1RootViewController *rvc = [[SV1RootViewController alloc] initWithNibName:@"SVC1RootView" bundle:nil];
    SV1DetailViewController *dvc = [[SV1DetailViewController alloc] initWithNibName:@"SVC1DetailView" bundle:nil];

    rvc.detailViewController = dvc;

    UINavigationController *nc = nil;
    if (hasRootNC) {
        nc = [self.pSVC1.viewControllers objectAtIndex:0];
        nc.viewControllers = [NSArray arrayWithObjects:rvc, nil];
        nc.navigationBar.tintColor = [UIColor redColor];
    } else {
        nc = nil;
    }

    UIViewController *vc = (hasRootNC)? (UIViewController*)nc :rvc;

    UISplitViewController *svc = [self newSplitViewControllerWithMasterVC:vc detailVC:dvc];
    svc.delegate = dvc;

    // init the tab bar item
    svc.tabBarItem = [[UITabBarItem alloc] initWithTitle:(hasRootNC)? @"SplitView with Nav Root":@"Simple SplitView"
                                                   image:nil 
                                                     tag:0];    
    // int the split view
    NSMutableArray *controllersArray = [NSMutableArray arrayWithArray:self.pTabBarController.viewControllers];
    [controllersArray addObject:svc];
    [self.pTabBarController setViewControllers:controllersArray];

    // cleanup
    [nc release];
    [rvc release];
    [dvc release];
    [svc release];
}

- (UISplitViewController*) newSplitViewControllerWithMasterVC:(UIViewController*)masterView
                                                     detailVC:(UIViewController*)detailView {

    UISplitViewController *svc = [[UISplitViewController alloc] init];
    NSMutableArray *controllersArray = [NSMutableArray arrayWithObjects:masterView, detailView, nil];
    [svc setViewControllers:controllersArray];

    return svc;
}

У кого-нибудь есть идеи для меня, пожалуйста?:)

Это сводит меня с ума !!!

Ответы [ 2 ]

1 голос
/ 21 января 2011

Разрешил это.Нужно было что-то сделать с этим странным сочетанием программной инициализации контроллера разделенного представления, но внедрения его с помощью контроллера навигации, считываемого из xib главного окна (все из-за пользовательской панели инструментов, необходимой для ошибки Apple).Но я предполагаю, что навигационный контроллер из xib имел выгруженный вид.

Так что теперь я просто беру весь SVC из кончика, а не создаю его вручную.Намного аккуратнее и проще на самом деле.

О, чувак. я был сбит с толку ответом на этот вопрос («назначенный» ответ!).Я только что заметил, что этот гораздо более простой метод также приводится в качестве ответа и на самом деле является самым популярным.Полностью пропустил это!^^

0 голосов
/ 20 января 2011

Не видя весь код, я предполагаю, что неактивное представление уничтожается во время предупреждения mem.(Часть кода, которая говорит «didReceiveMemoryWarning», у вас, вероятно, есть [super didReceiveMemoryWarning])

Вы должны убедиться, что в вашем методе loadView любые подпредставления, которые необходимо добавить, повторно добавляются в представлениеи выложил соответственно.Надеюсь, это поможет.

Или, если вы спешите или ленитесь, просто предотвратите все обычные вещи.Это возможно плохо и может привести к сбою, но это альтернативный подход, если вы нетерпеливы.

- (void)didReceiveMemoryWarning {
     //do nothing
    //[super didReceiveMemoryWarning];
}
...