9

私は、MasterViewControllerとしていくつかのviewControllerを持ち、DetailViewControllerとしていくつかのtableViewControllerを持つsplitViewControllerを持っています。masterViewController のボタンを押すと、既存のものではなく、detailViewController に新しい tableViewController を表示したいと考えています。

だから私はこれが好きでした:

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]];

対象のtableViewControllerメソッドに「passInSearchResults」データを渡し、reloadDataも呼び出します。メソッドは次のようになります。

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

コンソール: データが渡されます: [ここで、必要な正確なデータを取得し、それはちょうどいいようです]。

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」が呼び出されていないことです。

reloadData でメソッド「numberOfRowsInSection」が起動されますが、メソッド「cellForRowAtIndexPath」では起動されません... ???

ありがとう

4

7 に答える 7

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];
}

}

于 2012-07-09T15:50:52.460 に答える
4

numberOfRows を確認してください。0 の場合は、表示するセルがありません。

于 2012-11-11T01:47:47.423 に答える
4

reloadData でメソッド「numberOfRowsInSection」が起動されますが、メソッド「cellForRowAtIndexPath」では起動されません... ???

同じ (っぽい) 問題で 1 日過ごした後、ここでバグを見つけたと思います。ただし、ハック/回避策を見つけました。

cellForRowAtIndexPath メソッドで使用されている配列を変更 (値の追加/削除、または完全に再構築) すると、reloadData 時に 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;
}

したがって、reloadData を呼び出す前に searchResultsArrayWithSections 配列でこのメソッドを再度呼び出すと、実際にはすべての 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];
于 2011-04-21T00:01:16.153 に答える
3

私の場合、問題はreloadData()関数がメインスレッドから呼び出されなかったことです。

これをdispatch_async()関数に配置することで変更し、問題を解決しました。

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

これが他の人に役立つことを願っています。

于 2016-03-11T04:08:10.427 に答える
1

私も同じ問題を抱えていましたが、決定は非常に簡単でした。まず、テーブルを下にスクロールしてみてください。tableView:cellForRow...を呼び出す必要があります。tableViewのヘッダーの高さとcontentOffsetを確認します。

于 2011-12-20T14:05:04.320 に答える
0

また、viewController の init[With...] メソッドでテーブルを割り当て、IB で同じプロパティを配線することもできます。このようにして、numberOf... デリゲート メソッドが呼び出され、cellForRow... が呼び出されない可能性があります。

于 2013-02-19T04:25:27.427 に答える