Обновить определенную строку UITableView на основе Int в Swift


89

Я начинающий разработчик Swift и создаю базовое приложение, которое включает UITableView. Я хочу обновить определенную строку таблицы, используя:

self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.none)

и я хочу, чтобы строка, которая будет обновлена, будет из Int с именем rowNumber

Проблема в том, что я не знаю, как это сделать, и все потоки, которые я искал, относятся к Obj-C.

Любые идеи?


Есть только один раздел?
Линдси Скотт

Ответы:


196

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

let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)

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

Обновление для Swift 3.0:

let indexPath = IndexPath(item: rowNumber, section: 0)
tableView.reloadRows(at: [indexPath], with: .top)

если для определенного раздела будет изменено количество строк? @Lyndsey Scott
провал

@Lyndsey: Сначала скажем, что у меня есть 2 ячейки в том разделе, из которых я собираюсь перезагрузить, после перезагрузки скажем, у меня будет любое (x) количество ячеек в этом конкретном разделе, поэтому мой вопрос в том, что в строке вычисление indexpath, я уверен насчет раздела, но меня смущает количество строк, потому что он дает
падение

@dip вам нужно посмотреть на свой tableView: numberOfRowsInSection: алгоритм метода, чтобы получить эту информацию ... Я бы рекомендовал разместить ваш вопрос на форуме, поскольку это похоже на конкретную проблему, которая у вас возникла с вашим кодом ...
Линдси Скотт

Где вызвать этот метод?
Master AgentX

22

Для решения с мягким воздействием анимации:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
tableView.reloadRows(at: [indexPath], with: .fade)

Swift 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Это еще один способ защитить приложение от сбоев:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.index(of: indexPath as IndexPath) {
    if visibleIndexPaths != NSNotFound {
        tableView.reloadRows(at: [indexPath], with: .fade)
    }
}

Swift 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.indexOf(indexPath) {
   if visibleIndexPaths != NSNotFound {
      tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
   }
}

4

Swift 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

2

В Swift 3.0

let rowNumber: Int = 2
let sectionNumber: Int = 0

let indexPath = IndexPath(item: rowNumber, section: sectionNumber)

self.tableView.reloadRows(at: [indexPath], with: .automatic)

По умолчанию, если у вас есть только один раздел в TableView, вы можете поставить значение раздела 0.


2
let indexPathRow:Int = 0
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

1
Привет, добро пожаловать в Stack Overflow и спасибо за ваш первый ответ. Чтобы сделать ответ более полезным для других, лучше всего аннотировать свой ответ текстом, объясняющим, почему он отвечает на исходный вопрос OP.
Spangen

2

SWIFT 4.2

    func reloadYourRows(name: <anyname>) {
    let row = <your array name>.index(of: <name passing in>)
    let reloadPath = IndexPath(row: row!, section: 0)
    tableView.reloadRows(at: [reloadPath], with: .middle)
    }

1

Кроме того, если у вас есть разделы для tableview, вы не должны пытаться найти все строки, которые хотите обновить, вы должны использовать разделы перезагрузки. Это простой и более сбалансированный процесс:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)


0

Swift 4.1

используйте его при удалении строки с помощью selectedTag строки.

self.tableView.beginUpdates()

        self.yourArray.remove(at:  self.selectedTag)
        print(self.allGroups)

        let indexPath = NSIndexPath.init(row:  self.selectedTag, section: 0)

        self.tableView.deleteRows(at: [indexPath as IndexPath], with: .automatic)

        self.tableView.endUpdates()

        self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .automatic)

0

Я понимаю, что это вопрос для Swift, но вот эквивалентный код Xamarin принятого ответа, если кому-то интересно.

var indexPath = NSIndexPath.FromRowSection(rowIndex, 0);
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Top);

0
    extension UITableView {
        /// Reloads a table view without losing track of what was selected.
        func reloadDataSavingSelections() {
            let selectedRows = indexPathsForSelectedRows

            reloadData()

            if let selectedRow = selectedRows {
                for indexPath in selectedRow {
                    selectRow(at: indexPath, animated: false, scrollPosition: .none)
                }
            }
        }
    }

tableView.reloadDataSavingSelections()

Я оказался в особой ситуации. Моя главная цель состояла в том, чтобы добиться этого, когда пользователь находится в ячейке. И я внес некоторые изменения. Вы можете обновить только ту ячейку, в которой она находится, не загружая всю таблицу и не запутывая пользователя. По этой причине эта функция использует свойства tableView, добавляя настраиваемый ReloadDataCell. И добавляем tableview.reloadDataSavingSelecctions (). Где, вы делаете какое-то действие. И как только я это сделал, я хотел поделиться с вами этим решением.
irwin B

Пожалуйста, добавьте все пояснения к своему ответу, отредактировав его
Нико Хаасе
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.