1

У меня есть контроллер разделенного вида, в котором обе стороны имеют табличный вид и требуют перезагрузки таблицы каждый раз, когда какое-либо взаимодействие происходит с обеих сторон. Я внедрил делегат для обновления моего контроллера подробного представления всякий раз, когда ячейка выбрана с левой стороны (мастер) контроллера разделенного вида.Как обновить представление между контроллерами деталей и мастер-представлений UISplitViewController?

1.I хочу знать, нужно ли мне снова реализовать делегат, чтобы сделать это в обоих направлениях (т. Е. Обновить основной вид, когда a), или существует какой-либо общий подход.

2.I уже написал код для обоих классов, так что происходит, когда я выбираю ячейку слева, справа обновляется через метод делегата, перезагружая/обновляя представление, но такие методы, как viewWillAppear/viewDidAppear/viewWillDisapper. ..etc не вызываются. Теперь я вручную вызываю метод viewWillAppear из метода delegateMethod, который запускается при выборе левой ячейки. Есть техника, которую я пропускаю, так что методы класса называются авто. или Вы можете указать на лучший подход к использованию splitViewController?

ответ

1

Возможно, вам понадобится использовать один из методов UITableView reload... для перезагрузки таблицы. Метод reloadData перезагрузит полную таблицу. Если вы знаете, какие строки изменены, то, вероятно, лучше использовать один из других методов. Если изменения также относятся к числу строк, вам необходимо использовать один из методов insert... или delete... для получения правильной анимации. Для получения подробной информации см. UITableView documentation.

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

2

Во-первых, может быть нецелесообразно вызывать viewWillAppear и т. Д. Из вашего кода, потому что это поведение может измениться в будущем. (например, viewDidLoad используется для многократного вызова в ранних версиях iOS, теперь он вызывается один раз для каждого экземпляра). Вы можете просто переместить свой код в отдельный метод.

Во-вторых, вы можете посмотреть NSNotification как способ сообщить об изменениях. Это легко и не требует от вас каких-либо указателей делегатов.

Например, вы можете добавить в .h ребенок вид контроллера:

#define MASTER_UPDATED @"MasterUpdated" 
#define DETAIL_UPDATED @"DetailUpdated" 

, а затем в мастер-контроллер что-то вроде:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(updateFromDetail:) name:DETAIL_UPDATED object:nil]; 

... 

-(void)updateFromDetail:(NSNotification *)no 
{ 
    NSDictionary *nd = [no userInfo]; // get relevant information 

    // take action.... 
} 

Со стороны деталей, когда элемент сливают , вы должны отправить сообщение наподобие:

NSDictionary *userInfo = @{@"somekey":@"somevalue", @"anotherkey":@"anothervalue"}; 

[[NSNotificationCenter defaultCenter] postNotificationName:DETAIL_UPDATED 
    object:self userInfo:userInfo]; 
+0

Да, используя Уведомления, кроме делегатов. – djay

0

Hi @Divjyot Я сейчас работаю над подобным сценарием, но у меня есть для изменения на другой viewcontrolelr detailVIewController (SecondaryViewController) при нажатии на ячейку, так что это то, что я сделал Я создал и объединил все контроллеры view в masterViewController (PrimaryViewCOntroller) и передал в элемент detailViewController выбор ячейки с помощью делегата. Таким образом, при нажатии ячейки в primaryViewControlelr обновляется вторичный монитор с новым ViewController. Если вы хотите больше информации, как реализовать этот комментарий ниже

+1

Хорошо! Я использую делегат для запуска updateUI от мастера к деталям. и Уведомления для обратной роли. Я должен был одновременно обновить оба мастера и детали. Спасибо за понимание! – djay

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