0

我有一个 UITableViewController 订阅来自默认通知中心的通知。在为处理通知而定义的方法中,我创建了一个用于我的 tableview 数据源方法的排序数组。问题是 UITableVIew 显示的每个单元格都包含排序数组的最后一个条目,所以如果排序数组有 A、B、C,我会得到一个带有 C、C、C 的表......我无法弄清楚这一点,因为我使用该排序数组并将其中的每个对象放入字典中,如下所示:

 NSDictionary *dict = [self.sortedbirthdays objectAtIndex:indexPath.row];

然后我使用该字典的键添加到单元格标签。我确信这是我的逻辑错误,但我看不到它。任何帮助将不胜感激。

-(void)handleNotification:(NSNotification *)notification

{


[self.birthdays addObject:[notification userInfo]];
NSLog(@" unsorted %@", self.birthdays);


NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
                                             ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

self.sortedbirthdays = [self.birthdays sortedArrayUsingDescriptors:sortDescriptors];
NSLog(@" sorted %@", self.sortedbirthdays);
[self.tableView reloadData];

}

这是我的数据源方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   return [self.sortedbirthdays count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:  
(NSIndexPath *)indexPath
{


NSDictionary *dict = [self.sortedbirthdays objectAtIndex:indexPath.row];
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell == nil) {

    NSLog(@"sorted birth day length %d", [self.sortedbirthdays count]);

   cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:CellIdentifier];

    NSLog(@"calling cell for row at indexpath with %@:", dict);
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM-dd-yyyy"];
    NSString *dateString = [dateFormatter stringFromDate:[dict valueForKey:@"date"]];
    UILabel *dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(160, 8.0, 124, 28)];
    [ dateLabel setFont:[UIFont boldSystemFontOfSize:12.0]];
    [ dateLabel setTextAlignment:NSTextAlignmentRight];
    [ dateLabel setTextColor:[UIColor whiteColor]];
    [ dateLabel setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | 
UIViewAutoresizingFlexibleHeight)];
    dateLabel.tag = 1;
     dateLabel.text = dateString;

    // Add Main Label to Content View
    [cell.contentView addSubview:dateLabel];
    cell.contentView.backgroundColor = [UIColor randomColor];
    cell.textLabel.textColor = [UIColor whiteColor];
    cell.textLabel.text = [dict valueForKey:@"name"];


}

return cell;

}
4

1 回答 1

4

这是因为您在 if {} 下设置了一次 textLabel;你应该在 if {} 之后设置你的 textLabel。dequeueReusableCellWithIdentifier可以返回已存在的单元格。

你应该这样做

    NSDictionary *dict = [self.sortedbirthdays objectAtIndex:indexPath.row];
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil) {

        NSLog(@"sorted birth day length %d", [self.sortedbirthdays count]);

       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
    reuseIdentifier:CellIdentifier];
    }

    NSLog(@"calling cell for row at indexpath with %@:", dict);
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM-dd-yyyy"];
    NSString *dateString = [dateFormatter stringFromDate:[dict valueForKey:@"date"]];
    UILabel *dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(160, 8.0, 124, 28)];
    [ dateLabel setFont:[UIFont boldSystemFontOfSize:12.0]];
    [ dateLabel setTextAlignment:NSTextAlignmentRight];
    [ dateLabel setTextColor:[UIColor whiteColor]];
    [ dateLabel setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | 
    UIViewAutoresizingFlexibleHeight)];
    dateLabel.tag = 1;
    dateLabel.text = dateString;

    // Add Main Label to Content View
    [cell.contentView addSubview:dateLabel];
    cell.contentView.backgroundColor = [UIColor randomColor];
    cell.textLabel.textColor = [UIColor whiteColor];
    cell.textLabel.text = [dict valueForKey:@"name"];

    return cell;

dequeueReusableCellWithIdentifier- 优化 UITableView 的方法,即使在tableView:numberOfRowsInSection:方法中返回 100,实际上表格视图中 UITableViewCell 对象的数量也更少

请参阅Apple 文档中的创建和配置表视图

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/CreateConfigureTableView/CreateConfigureTableView.html#//apple_ref/doc/uid/TP40007451-CH6-SW10

于 2013-10-07T19:50:09.980 回答