UITableView insertSections: withRowAnimation: то, чтобы заставлять все ячейки таблицы требоваться

В C# 6 и выше Вас может просто использовать синтаксис:

public object Foo { get; set; } = bar;

Примечание, что для имения readonly свойство просто опускают набор, как так:

public object Foo { get; } = bar;

можно также присвоиться readonly автосвойства от конструктора.

До этого я ответил как ниже.

я постарался бы не добавлять значение по умолчанию к конструктору; оставьте это для динамических присвоений и постарайтесь не иметь две точки, в которых переменная присвоена (т.е. значение по умолчанию типа и в конструкторе). Обычно я просто записал бы нормальное свойство в таких случаях.

Еще одна опция состоит в том, чтобы сделать, какой ASP.NET делает и определяет значения по умолчанию через атрибут:

http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

7
задан Nick Veys 22 May 2012 в 22:47
поделиться

1 ответ

Похоже, вы указываете таблице вставить все разделы, что в основном эквивалентно перезагрузке. Когда вы сообщаете таблице, что ей нужно загрузить раздел, она должна прочитать все элементы в этом разделе. Кроме того, вы делаете это вне блока beginUpdates / endUpdates, что означает, что каждый раз, когда вы добавляете в раздел, таблица должна немедленно фиксировать изменения. Если вы заключите все в beginUpdates / endUpdates, он приостановит все запросы до тех пор, пока это не будет выполнено, что позволит системе объединить избыточные запросы и исключить запросы, которые оказываются ненужными.

Вы должны вызывать insertSections только с добавлены новые разделы. Если вы это сделаете, tableview не будет запрашивать информацию обо всех неизмененных разделах, даже если они перемещаются. Также, если элементы внутри раздела изменяются, а сам раздел не является, вам следует использовать строковую версию методов для изменения этих конкретных строк внутри раздела, и будут запрашиваться только эти строки.

Ниже приведен пример (из Приложение на основе CoreData), которое должно быть понятным. Поскольку у вас есть собственная модель вместо NSFetchedResultsController, вам нужно будет выяснить тип происходящего действия, а не просто проверять набор констант, переданных вам системой.

//Calculate what needs to be changed     

[self.tableView beginUpdates];

for (i = 0 i < changeCount; i++) {
  type = changes[i]; 

  switch(type) {
    case NSFetchedResultsChangeInsert:
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                    withRowAnimation:UITableViewRowAnimationFade];
      break;

    case NSFetchedResultsChangeDelete:
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                    withRowAnimation:UITableViewRowAnimationFade];
      break;
  }
}

switch(type) {

  case NSFetchedResultsChangeInsert:
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                          withRowAnimation:UITableViewRowAnimationFade];
    break;

  case NSFetchedResultsChangeDelete:
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                          withRowAnimation:UITableViewRowAnimationFade];
    break;

  case NSFetchedResultsChangeUpdate:
    [self configureCell:(id)[tableView cellForRowAtIndexPath:indexPath]
            atIndexPath:indexPath];
    break;

  case NSFetchedResultsChangeMove:
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                          withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section]
                  withRowAnimation:UITableViewRowAnimationFade];
    break;
  }
}

[self.tableView endUpdates];
6
ответ дан 7 December 2019 в 10:06
поделиться