我有一个包含TabBar和一些TabBarControllers的应用程序。一个Controller包含一个非常简单的表,它应该显示NSMutableDictionary的内容。当您点击相应的按钮时,Dictionary将在单独的Controller中更新,视图将切换到UITableViewController
,显示新更新的表。
我可以看到字典正在更新。但TableView从未反映出这些变化。实际上,它似乎只在我第一次进入该屏幕时显示更改。
我尝试过[self table.reloadData]并且在调用它时,更改不会反映到UITableView
。
有没有人有任何建议?我很乐意发布代码,但我不确定要发布什么。
更新:表格仅在第一次显示时更新并正确刷新。后续显示只显示原始内容。
背景: tableview从字典填充:appDelegate.currentFave。每次TabBarController调用ViewController时,都应刷新tableview。
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"in viewWillAppear");
[super viewWillAppear:animated];
[self loadFavesFile];
[self.tableView reloadData];
}
// load the Favorites file from disk
- (void) loadFavesFile
{
// get location of file
NSString *path = [self getFavesFilePath];
// The Favorites .plist data is different from the Affirmations in that it will never be stored in the bundle. Instead,
// if it exists, then use it. If not, no problem.
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
// read Faves file and store it for later use...
NSMutableDictionary *tempDict = [NSMutableDictionary dictionaryWithContentsOfFile:path];
appDelegate.sharedData.dictFaves = tempDict;
// grab the latest quote. Append it to the list of existing favorites
NSString *key = [NSString stringWithFormat:@"%d", appDelegate.sharedData.dictFaves.count + 1];
NSString *newFave = [NSString stringWithFormat:@"%@", appDelegate.currentFave];
[appDelegate.sharedData.dictFaves setObject:newFave forKey:key];
} else {
NSLog(@"Favorites file doesn't exist");
appDelegate.sharedData.dictFaves = nil;
}
}
// this gets invoked the very first call. Only once per running of the App.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// reuse or create the cell
static NSString *cellID = @"cellId";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
// allow longer lines to wrap
cell.textLabel.numberOfLines = 0; // Multiline
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.font = [UIFont fontWithName:@"Chalkduster" size:(16)];
cell.textLabel.textColor = [UIColor yellowColor];
// NOTE: for reasons unknown, I cannot set either the cell- or table- background color. So it must be done using the Label.
// set the text for the cell
NSString *row = [NSString stringWithFormat:@"%d", indexPath.row + 1];
cell.textLabel.text = [appDelegate.sharedData.dictFaves objectForKey:row];
return cell;
}
答案 0 :(得分:1)
我发现了问题。我没有在我的视图控制器中正确初始化和分配TableView。见下文
- (void)viewDidLoad
{
[super viewDidLoad];
tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain];
tableView.dataSource = self;
tableView.delegate = self;
tableView.backgroundColor=[UIColor blackColor];
self.view = tableView;
}
答案 1 :(得分:0)
假设您提供的代码是正确的,您希望使用[self.table reloadData]
。您的.
位置错误。
答案 2 :(得分:0)
昨天我遇到了同样的问题,对我来说,事实证明我在界面构建器中设置了错误的文件所有者,并且没有正确设置数据源并委托表视图。
尝试进入界面构建器并右键单击文件所有者,这应该会显示是否有任何内容未正确连接。
答案 3 :(得分:0)
你应该确保你的Interface Builder连接设置正确,但真正这个问题听起来就是你cellForRowAtIndexPath:
内的if(cell == nil)
中有你的UITableViewCell设置代码声明。它不应该是。让我解释。如果你有一个单元格列表,并且你想将每个单元格的标题设置为一个名为myArray
的数组中的字符串,那么你的(不正确的)代码就像这样:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
if (cell == nil) {
// No cell to reuse => create a new one
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellIdentifier"] autorelease];
[[cell textLabel] setText:[myArray objectAtIndex:[indexPath row]]];
}
return cell;
}
你能看到那个逻辑的问题吗?如果找不到可重复使用的单元格,单元格将只获得更新的标题,在您的情况下,这听起来像是情况。 Apple表示,每次调用cellForRowAtIndexPath:
时都应创建一个“新”单元格,这意味着您将所有设置代码放在if(cell == nil)
检查的之外。
继续这个例子,正确的代码如下所示:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
if (cell == nil) {
// No cell to reuse => create a new one
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellIdentifier"] autorelease];
}
[[cell textLabel] setText:[myArray objectAtIndex:[indexPath row]]];
return cell;
}
这样,为单元格分配了正确的字符串是否找到了可重复使用的单元格,因此调用reloadData
将产生预期的效果。