UISpliviewcontroller в рекурсивных вызовах завершается с ошибкой после предупреждения памяти - PullRequest
0 голосов
/ 09 марта 2011

Любая помощь приветствуется! Уже несколько дней я бьюсь без результатов.

Сценарий:

В приложениях I и iPad есть SplitViewController, который отображает 2 контроллера-вида (Root слева e Деталь справа)

Root допускает рекурсивную навигацию (дерево, которое может иметь несколько уровней детализации), и я каждый раз вызываю один и тот же класс контроллера (UITableView), помещая его всегда в стек контроллера). Когда пользователь касается ячейки (слева), подробный вид (справа) показывает информацию. Помните, что контроллер подробного представления не всегда является одним и тем же классом: это означает, что я программно распределяю (и освобождаю) несколько контроллеров detailView в соответствии с видом информации, которую я должен отображать.

Вот фрагмент:

UIViewController <ItemGenericViewController> *newDetailViewController = [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil];

//the detailViewController has been defined in the head section as ItemGenericViewController

//each detailViewController is a subclass of ItemGenericViewController

detailViewController = newDetailViewController;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController];

// Update the split view controller's view controllers array.

NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil];
self.splitViewController.viewControllers = viewControllers;
[nav release];
[viewControllers release];
[detailViewController release];

Все работает нормально, пока не появится предупреждение памяти.

С этого момента, если я пытаюсь отобразить новый detailViewcontroller, «соединение» в SplitViewController между RootController и detailController, кажется, исчезает. Результат: ничего не появляется в правой части splitController. В то же время, если я перехожу к родительскому уровню в корневом контроллере, ситуация все еще не выполняется.

Для вашего сведения, каждый раз, когда я помещаю в стек новый экземпляр RootController (левый столбец), я выпускаю один и тот же контроллер (чтобы сохранить память как обычно) и подозреваю, что после получения предупреждения о памяти iOS пытается освободить Сама память и моя «история» исчезают и связанное с ними соединение, также через контроллер разделения.

Это кошмар; -)

У вас есть предложения?

Спасибо

Dario

1 Ответ

1 голос
/ 10 мая 2011

У меня была похожая проблема с вами (возможно, даже хуже - 16 комбинаций возможных переключателей вида) ... Но я думаю, что я решил ее прямо сейчас.

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

Вот код, используя пример сверху:

 UIViewController <ItemGenericViewController> *newDetailViewController =  [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil];

//the detailViewController has been defined in the head section as ItemGenericViewController

//each detailViewController is a subclass of ItemGenericViewController

detailViewController = newDetailViewController;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController];

// Update the split view controller's view controllers array.

NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil];

/**** Milos Edit ****/
if (self.splitViewController == nil) {
    // I'm keeping reference in app delegate, but any way to reinitialize splitViewController is OK
    self.splitViewController = delegate.splitViewController;
}
/**** end of edit ****/
self.splitViewController.viewControllers = viewControllers;
[nav release];
[viewControllers release];
[detailViewController release];

Надеюсь, это будет полезно.*

Приветствия

Милос

...