2014-01-21 3 views
0

Я пытался обновить tableview в masterviewcontroller от detailviewcontroller, используя делегат. Я вызвал reloadData из методов делегата, но он не работал. Я все еще не мог этого решить.self.tableView reloadData не работает в UISplitViewController master detail application

это мой метод делегата в MasterViewController

- (void)updateScore:(DetailViewController *)controller withScore:(NSUInteger)score { 

     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:_selectedIndexPath]; 

     NSLog(@"%@", cell.detailTextLabel.text); 

     cell.detailTextLabel.text = [NSString stringWithFormat:@"Best score: %lu", (unsigned long)score]; 

     [self.tableView reloadData]; 

     NSLog(@"%@", cell.detailTextLabel.text); 

} 

из NSLog был обновлен cell.detailTextLabel.text, но TableView не перезагружать

благодаря

ответ

4

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

Если вы используете раскадровки, под инспектором подключений, ваш ta bleview необходим ваш контроллер представления устанавливается как DataSource и делегат

, если вы хотите просто сделать это в файле viewcontroller.m в методе viewDidLoad вы можете использовать эти строки

self.tableView.delegate = self; 
self.tableView.dataSource = self; 
+0

ответ на сообщение, но я уже это сделал. потому что мне нужны источники данных и методы делегирования из masterview, чтобы показать данные данных на detailviewcontroller – taylorSWIFT

0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     //other init 
    } 

    if(_selectedIndexPath.row == indexPath.row && _selectedIndexPath.section == indexPath.section){ 
     cell.detailTextLabel.text = [NSString stringWithFormat:@"Best score: %lu", (unsigned long)score]; 
    } 

} 

Вы можете попробовать двигаться код в cellForRowAtIndexPath выше тогда Tableview reloadData

0
  1. [self.tableView reloadData] обновляет все видимые ячейки в таблице. Он называет numberOfSectionsInTableView, numberOfRowsInSection, cellForRowAtIndexPath и так далее. Другими словами: он полностью обновляет таблицу.
  2. Единственный правильный способ установки содержимого ячейки - установить его в cellForRowAtIndexPath. Код:

    if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; //other init} 
    

    никогда не вызывается с iOS 6, если вы используете раскадровки.

Так с вами код:

  1. использовать неправильный путь к содержимому настройки ячейки.
  2. очистить все ваши настройки с помощью [self.tableView reloadData].

Решение:

  1. Сохранить score в __strong ivar или property.
  2. Звоните [self.tableView reloadData]. Он вызывает cellForRowAtIndexPath в соответствующее время.
  3. Установите новый score в cellForRowAtIndexPath метод.

Предложение: Использование:

dispatch_async(dispatch_get_main_queue(), ^(){ [self.tableView reloadData]; }); 

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

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