7

Я пытаюсь собрать приложение iPad с помощью UISplitViewController и раскадровки. Главный вид начинается с контроллера навигации, связанного с табличным представлением 6 опций меню. Каждая ячейка в таблице подталкивает другой контроллер табличного представления в стек навигации. Это отлично работает для главного представления. В каждом представлении мастера есть список таблиц, который при щелчке должен отображать другой контроллер представления в панели подробностей. В настоящее время я сделал это с настройкой segue на «Replace» и «Detail Split», которая работает при первом щелчке строки, но как только вы нажмете еще одну строку в главном представлении или поверните устройство, приложение отключится с EXC_BAD_ACCESS.iOS - UISplitViewController с раскадрой - несколько основных видов и несколько подробных представлений

Я уверен, что мои проблемы связаны с настройкой делегата для UISplitViewController. Я смущен относительно того, как это следует использовать, когда у меня есть несколько главных VC и несколько VC с несколькими деталями. Где должен быть размещен код делегата - мастер или деталь? Должен ли я реализовывать события протокола UISplitViewControllerDelegate в каждом контроллере представления?

Любая помощь приветствуется.

ответ

16

Если делегат контроллера разделенного представления был заменен контроллером подробного представления, это стало причиной сбоя. Контроллер замещаемого подробного представления деаллокод и поэтому делегат контроллера разделенного представления больше не является ссылкой на действительный объект.

Вы можете обновить делегат в файле prepareForSegue: sender :. Например:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"MySegue"]) { 
     UIViewController *destinationViewController = [segue destinationViewController]; 
     if ([destinationViewController conformsToProtocol:@protocol(UISplitViewControllerDelegate)]) { 
      self.splitViewController.delegate = destinationViewController; 
     } 
     else { 
      self.splitViewController.delegate = nil; 
     } 
    } 
} 

Какие контроллеры представлений, которые вы используете для делегатов, зависят от иерархии вашего контроллера представления. В простейшем случае любые контроллеры представлений, которые назначены деталям splitVC, вероятно, должны быть делегатами. Возможно, вы захотите основать их на общем суперклассе, который обрабатывает логику делегирования контроллера разделенного представления.

+0

Большое спасибо Крис, приятное объяснение. –

+0

Спасли мой день. –

+0

Это действительно помогло мне! – Fogh

Смежные вопросы