Оновіть певний рядок UITableView на основі Int у Swift


89

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

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

і я хочу, щоб рядок, який буде оновлено, був із Int з іменем rowNumber

Проблема в тому, що я не знаю, як це зробити, і всі теми, які я шукав, стосуються Obj-C

Будь-які ідеї?


Чи є лише один розділ?
Lyndsey Scott

Відповіді:


197

Ви можете створити номер 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: алгоритм методу, щоб отримати цю інформацію ... Я б рекомендував опублікувати своє запитання на форумі, оскільки це звучить як конкретна проблема, яка виникає у вас з кодом ...
Lyndsey Скотт

Куди дзвонити цей метод?
Master AgentX

22

Для рішення анімації з м’яким ударом:

Свіфт 3:

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

Свіфт 2.x:

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

Це ще один спосіб захистити програму від збою:

Свіфт 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)
    }
}

Свіфт 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

Стрімкий 4

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

3

У 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)

byDefault, якщо у вас є лише один розділ у TableView, тоді ви можете поставити значення розділу 0.


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

1
Привіт, Ласкаво просимо до Stack Overflow та дякуємо за першу відповідь. Щоб зробити відповідь більш корисною для інших людей, найкращою практикою є анотувати свою відповідь текстом, який пояснює, чому вона стосується початкового питання ОП.
Шпанген

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

Крім того, якщо у вас є розділи для перегляду таблиці, вам не слід намагатися знаходити всі рядки, які ви хочете оновити, ви повинні використовувати розділи перезавантаження. Це простий і збалансований процес:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

Як на рахунок:

self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)

0

Свіфт 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

Я розумію, що це питання стосується Свіфта, але тут є еквівалентний 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.