UITableView没有刷新

时间:2012-01-31 00:21:27

标签: iphone ios uitableview reloaddata

我有一个包含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;    
}

4 个答案:

答案 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将产生预期的效果。