2010-12-15 4 views
163

У меня есть обычай UITableView, используя UITableViewCell s. Каждый UITableViewCell имеет 2 кнопки. Нажатие этих кнопок изменит изображение в ячейке UIImageView.Возможно ли обновить один UITableViewCell в UITableView?

Возможно ли обновить каждую ячейку отдельно, чтобы отобразить новое изображение? Любая помощь приветствуется.

ответ

297

После того как вы indexPath вашей камеры, вы можете сделать что-то вроде:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

В Xcode 4.6 и выше:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

Вы можете установить любой ваш вроде как эффект анимации, из курс.

+4

придирки здесь, но, конечно, если бы вы только освежать одну ячейку вы, вероятно, хотите использовать `[NSArray arrayWithObject:]` вместо этого. – 2011-02-16 19:50:52

+49

Кроме того, в этой ситуации «beginUpdates» и «endUpdates» не нужны. – kubi 2011-03-11 01:00:32

+0

@ kubi привет, вы можете объяснить, почему они не нужны? – Unheilig 2013-07-14 17:24:37

31

Я пробовал просто позвонить -[UITableView cellForRowAtIndexPath:], но это не сработало. Но, например, для меня работает следующее. I alloc и releaseNSArray для жесткого управления памятью.

- (void)reloadRow0Section0 { 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; 
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 
    [indexPaths release]; 
} 
4

Просто слегка обновить эти ответы с новым буквального синтаксиса в IOS 6 - вы можете использовать Paths = @ [indexPath] для одного объекта, или Paths = @ [indexPath1, indexPath2 ...] для нескольких объектов.

Лично я нашел буквальный синтаксис для массивов и словарей, которые были бы чрезвычайно полезны и были бы важными хранителями времени. Во-первых, это просто читать. И это устраняет необходимость в нуле в конце любого списка нескольких объектов, который всегда был личным bugaboo. У всех нас есть свои ветряные мельницы, чтобы наклониться, да? ;-)

Просто подумал, что я брошу это в микс. Надеюсь, поможет.

15

Если вы используете пользовательские TableViewCells, общий

[self.tableView reloadData];  

не эффективно ответить на этот вопрос если вы не оставляете текущий вид и вернуться обратно. И первый ответ.

Чтобы успешно перезагрузить свой первый вид таблицы ячейки без переключения видом, используйте следующий код:

//For iOS 5 and later 
- (void)reloadTopCell { 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; 
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 
} 

Вставьте следующий метод обновления, который вызывает к описанным выше способом, так что вы можете пользовательские перезагрузки только верхняя ячейка (или весь вид таблицы, если вы хотите):

- (void)refresh:(UIRefreshControl *)refreshControl { 
    //call to the method which will perform the function 
    [self reloadTopCell]; 

    //finish refreshing 
    [refreshControl endRefreshing]; 
} 

Теперь, когда у вас есть, что сортируется, внутри вашего viewDidLoad оных следующее:

//refresh table view 
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; 

[self.tableView addSubview:refreshControl]; 

Теперь у вас есть пользовательская функция таблицы обновления, которая перезагрузит верхнюю ячейку. Чтобы перезагрузить всю таблицу, добавьте

[self.tableView reloadData]; к вашему новому методу обновления.

Если вы хотите перезагружать данные каждый раз при переключении представлений, реализовать метод:

//ensure that it reloads the table view data when switching to this view 
- (void) viewWillAppear:(BOOL)animated { 
    [self.tableView reloadData]; 
} 
17

Swift:

func updateCell(path:Int){ 
    let indexPath = NSIndexPath(forRow: path, inSection: 1) 

    tableView.beginUpdates() 
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations 
    tableView.endUpdates() 
} 
18

reloadRowsAtIndexPaths: это хорошо, но все-таки заставит UITableViewDelegate методы стрелять.

Самый простой подход, который я могу себе представить:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
[self configureCell:cell forIndexPath:indexPath]; 

Это важно вызвать вашу configureCell: реализацию на главном потоке, так как он не будет работать на не-UI потоке (та же история с reloadData/reloadRowsAtIndexPaths:). Иногда это может быть полезно добавить:

dispatch_async(dispatch_get_main_queue(),^
{ 
    [self configureCell:cell forIndexPath:indexPath]; 
}); 

Стоит также избегать работы, которая будет сделано за пределами текущего видимого зрения:

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound; 
if (cellIsVisible) 
{ 
    .... 
} 
5

Swift 3:

tableView.beginUpdates() 
tableView.reloadRows(at: [indexPath], with: .automatic) 
tableView.endUpdates() 
0

I нужна ячейка обновления, но я хочу закрыть клавиатуру. Если я использую

let indexPath = NSIndexPath(forRow: path, inSection: 1) 
tableView.beginUpdates() 
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations 
tableView.endUpdates() 

клавиатура исчезнет

Смежные вопросы