3

我有一个应该有 33 行的 UITableView。每行代表一天中的特定时间段。当包含表视图的视图加载时,我需要它相应地填充每一行。

我有一组传递给视图的保留对象。每个预留包含一个槽号、一个预留名称和槽中预留的持续时间。

填充表格的最佳方法是什么,我目前正在遍历- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中的保留数组。

这并没有给我预期的结果或行为。性能极差,因为它不断迭代循环,滚动后不应该是蓝色的单元格是蓝色的。解决这个问题的最佳方法是什么?我已经包含了下面的代码。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 33;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    NSString *timeStamp = [NSString stringWithFormat:@"%.2f", (indexPath.row + 14.0 ) / 2.0];
    timeStamp = [timeStamp stringByReplacingOccurrencesOfString:@".50" withString:@":30"];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"%@: ", timeStamp];

    for (Reservation *temp in bookingsArray) {
        if ((temp.slotNumber - 1) == indexPath.row) {
            cell.textLabel.text = [NSString stringWithFormat:@"%@: %@", timeStamp, temp.reservationName];
            cell.contentView.backgroundColor = [UIColor blueColor];
        }
        for (NSNumber *tempNo in temp.slotIdentifiers) {
            if ([tempNo intValue] -1 == indexPath.row) {
                //cell.textLabel.text = [NSString stringWithFormat:@"%@: Booked", timeStamp];
                cell.contentView.backgroundColor = [UIColor blueColor];
            }
        }
    }

    return cell;
}

更新尝试以下给我奇怪的行为,在我开始滚动后所有单元格都变成蓝色。

- (void)viewDidLoad
{
    [super viewDidLoad];
    bookManager = appDelegate.bookingManager;
    bookingsArray = [[NSArray alloc] initWithArray:[bookManager getBookingsForCourt:1 onDate:[NSDate date]]];
    namesArray = [[NSMutableDictionary alloc] init];
    slotIndexSet = [NSMutableIndexSet indexSet];

    for (int c = 0; c < 33; c++) {
        [namesArray setObject:@"Available" forKey:[NSNumber numberWithInt:c]];
    }

    for (Reservation *temp in bookingsArray) {
        [namesArray setObject:temp.reservationName forKey:[NSNumber numberWithInt:temp.slotNumber]]; 
        for (NSNumber *slotNo in temp.slotIdentifiers) {
            [slotIndexSet addIndex:[slotNo intValue] + 1];
        }
    }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    NSString *timeStamp = [NSString stringWithFormat:@"%.2f", (indexPath.row + 14.0 ) / 2.0];
    timeStamp = [timeStamp stringByReplacingOccurrencesOfString:@".50" withString:@":30"];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"%@: ", timeStamp];
    cell.textLabel.text = [namesArray objectForKey:[NSNumber numberWithInt:indexPath.row]]; 

    if ([slotIndexSet containsIndex:indexPath.row]) {
       cell.contentView.backgroundColor = [UIColor blueColor]; 
    }

    return cell;
}
4

1 回答 1

1

您需要做两件事来加快速度:

  • 以索引处的对象等于的方式转换bookingsArray为数组。您可以在收到原始预订数组时对其进行迭代。bookingBySlotNumberislotNumber - 1i
  • 创建一个包含已预订项目索引的NSIndexSet调用。isBookedBySlotNumber您可以通过 all 来准备它,并标记已预订项目Reservation.slotIdentifiers的索引。isBookedBySlotNumber

有了这两个预处理项,您就可以完全消除嵌套循环:外部循环将替换为 in 中的查找bookingBySlotNumber,内部循环将替换为 in 中的循环isBookedBySlotNumber

于 2012-08-30T21:00:22.987 回答