2

我有一个由带有几个 TabBarControllers 的 TabBar 组成的应用程序。一个控制器包含一个非常简单的表格,它应该显示 NSMutableDictionary 的内容。当您点击相应的按钮时,Dictionary 会在单独的 Controller 中更新,并且视图会切换到UITableViewController,显示新更新的表格。

我可以看到字典正在更新。但是 TableView 永远不会反映这些变化。事实上,它似乎只在我第一次进入该屏幕时显示更改。

我已经尝试过 [self table.reloadData] 并且当它被调用时,更改不会反映到UITableView.

有没有人有什么建议?我很高兴发布代码,但不确定要发布什么。

更新:表格仅在第一次显示时正确更新和刷新。随后的显示仅显示原始内容。

背景:表格视图从字典中填充: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;    
}
4

4 回答 4

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;
}
于 2012-02-17T01:18:07.933 回答
0

假设您提供的代码是正确的,您想使用[self.table reloadData]. 你有.错误的地方。

于 2012-01-31T00:48:10.903 回答
0

昨天我遇到了同样的问题,对我来说,我在界面生成器中设置了错误的文件所有者,并且没有正确设置表视图的数据源和委托。

尝试进入界面生成器并右键单击文件所有者,这应该会告诉您是否有任何未正确连接。

于 2012-01-31T00:49:41.573 回答
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将产生预期的效果。

于 2012-01-31T01:20:44.590 回答