Измените несколько строк на uitableview при загрузке вида

У меня есть UITableView, который должен иметь 33 строки. Каждая строка представляет определенный временной интервал за день. Когда представление, которое поддерживает загрузку таблицы, мне нужно, чтобы оно заполнило каждую строку соответственно.

У меня есть массив объектов резервирования, которые передаются в представление. Каждое резервирование содержит номер слота, имя резервирования и продолжительность резервирования в слотах.

Каков наилучший способ заполнения таблицы, в настоящее время я повторяю массив резервирования в методе - (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;
}

UPDATE Попытка следующего дает мне странное поведение, когда все ячейки становятся синими после начала прокрутки.

- (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;
}
1 ответ

Вам нужно сделать две вещи, чтобы ускорить это:

  • Преобразуйте bookingsArray в массив bookingBySlotNumber таким образом, чтобы объект с индексом i имел slotNumber - 1, равный i. Вы можете сделать это, перебирая исходный массив заказов, когда вы его получите.
  • Создайте NSIndexSet под названием isBookedBySlotNumber, содержащий индексы позиций, которые были забронированы. Вы можете подготовить его, пройдя все Reservation.slotIdentifiers и маркируя индексы isBookedBySlotNumber для предметов, которые были забронированы.

С этими двумя предварительно обработанными элементами на месте вы можете полностью исключить вложенные петли: внешняя будет заменена поиском в bookingBySlotNumber, а внутренняя - петлей в isBookedBySlotNumber.

licensed under cc by-sa 3.0 with attribution.