2010-08-12 3 views
7

У меня есть splitViewController, у которого в качестве MasterViewController есть некоторый viewController и как DetailViewController некоторый tableViewController. Когда я нажимаю кнопку на masterViewController, я хочу показать новый tableViewController в detailViewController вместо существующего.UITableView reloadData - cellForRowAtIndexPath не активирован

Так что я сделал так:

SearchDetailViewController *searchDetailViewController = [[SearchDetailViewController alloc] initWithStyle:UITableViewStylePlain]; 
UINavigationController *searchDetailNavigationController = [[UINavigationController alloc] initWithRootViewController:searchDetailViewController]; 

После этого я передаю данные, чтобы показать в новом tableController:

[searchDetailViewController passInSearchResults:listOfItems]; 

После того, что я "толчок" новые контроллеры splitViewController:

[searchSplitViewController setViewControllers:[NSArray arrayWithObjects:self.navigationController, searchDetailNavigationController, nil]]; 

В целевой таблицеViewController передаются данные passInSearchResults, и я также вызываю reloadDa та. Метод выглядит следующим образом:

- (void)passInSearchResults:(NSMutableDictionary *)searchResults { 
    self.searchResultList = searchResults; 
    NSLog(@"Data is passed in: %@",self.searchResultList); 
    [self.tableView reloadData]; 
    //[self.tableView setNeedsDisplay]; 
} 

Console: Данные передаются в: [здесь я получить точные данные, которые я хочу, и это, кажется, впору].

After this I see that method "numberOfRowsInSection" is fired: 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"Setting table length: %i",[self.searchResultList count]); 
    return [self.searchResultList count]; 
} 

консоли: Установка длины таблицы: [здесь я получаю правильную длину]

Проблема заключается в том, что таблица не заполнена передаваемых данных и метод «cellForRowAtIndexPath» не называется.

Как это может быть, что при перезагрузке метод «numberOfRowsInSection» уволен, но не метод «cellForRowAtIndexPath» ... ???

Благодаря

ответ

4

Как это может быть, что по методу reloadData "numberOfRowsInSection" увольняют, но не метод "cellForRowAtIndexPath" ... ???

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

Если я изменяю массив (добавляя/удаляя значения или полностью строя его снова), который используется в моем методе cellForRowAtIndexPath, кажется, правильно снова вызвать cellForRowAtIndexPath при перезагрузке.

К примеру, в моем cellForRowAtIndexPath у меня есть что-то вроде:

cell.textLabel.text = [[[self.searchResultsArrayWithSections objectAtIndex:indexPath.section] objectForKey:@"rowValues"] objectAtIndex:indexPath.row]; 

    return cell; 

У меня также есть метод для создания этого массива, который вызывается на viewDidLoad:

- (NSMutableArray *)splitIntoSectionsWithAlphabet:(NSMutableArray *)myArray 
{  
NSString *letters = @"abcdefghijklmnopqrstuvwxyz"; 
NSMutableArray *content = [NSMutableArray new]; 

//code to build array here, nothing special really 

return content; 
} 

Так что я заметил, что если я специально назовите этот метод еще раз в моем массиве searchResultsArrayWithSections перед вызовом reloadData, он фактически называет все методы UITableViewDelegate правильно! (как я уже сказал, взломать, но он работает!)

//dirty hack, bug with cancel button and not realoding data, seems we have to modify this array before it will work correctly 
self.customerListArrayWithSections = [self splitIntoSectionsWithAlphabet:self.customerListArray]; 
[self.customerListTv reloadData]; 
1

У меня была та же проблема, но решение было очень простым. Прежде всего, не могли бы вы прокрутить таблицу вниз? tableView: cellForRow ... следует вызвать. Проверьте высоту и содержимое заголовковОфис для таблицыView.

10

Проверить, если вы находитесь в главном потоке при вызове [self.tableView reloadData];

- (void)passInSearchResults:(NSMutableDictionary *)searchResults { 
if ([NSThread isMainThread]) { 
    self.searchResultList = searchResults; 
    NSLog(@"Data is passed in: %@",self.searchResultList); 
    [self.tableView reloadData]; 
} 
else { 
    [self performSelectorOnMainThread:@selector(passInSearchResults:) searchResults waitUntilDone:NO]; 
} 

}

+1

Нет необходимости проверять, что вы работаете в основном потоке. 'performSelectorOnMainThread' работает даже в том случае, если вы уже находитесь в основном потоке, как и' dispatch_async (dispatch_get_main_queue() '(что, вероятно, вам действительно нужно здесь). Добавление' if' здесь просто потребляет ненужные циклы процессора. –

4

Проверьте numberOfRows, если 0, нет клеток для отображения.

0

Также вы можете выделить таблицу в методе init [With ...] viewController, а также подключить такое же свойство в IB. Таким образом, возможно, что методы numberOf ... delegate вызываются, а cellForRow - нет.

0

My "AutoLayouted" UITableView не вызывал cellForRowAtIndexPath on reloadData, потому что я задал кадр по ошибке.

_tableView = [[UITableView alloc] initWithFrame:self.view.frame]; 
_tableView.translatesAutoresizingMaskIntoConstraints = NO; 

Изменяя его CGRectZero, он работал ..

_tableView = [[UITableView alloc] initWithFrame:CGRectZero]; 
_tableView.translatesAutoresizingMaskIntoConstraints = NO; 
2

В моем случае проблема была, что функция reloadData() не был вызван из основного потока.

я изменил это, помещая его в dispatch_async() функции, что позволило решить проблему:

dispatch_async(dispatch_get_main_queue(), { 
    self.tableView.reloadData() 
}) 

Надеется, что это помогает другим.

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