在 Swift 中基于 Int 刷新 UITableView 的某些行



我是 Swift 的初级开发人员,我正在创建一个包含 UITableView 的基本应用程序。我想使用以下方法刷新表格的某一行:

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

并且我希望将刷新的行来自名为 rowNumber 的 Int

问题是,我不知道该怎么做,我搜索的所有线程都是针对 Obj-C

有什么想法吗?

您可以使用

行号和节号创建一个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)

对于软冲击动画解决方案:

斯威夫特 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)

这是保护应用程序免于崩溃的另一种方法:

斯威夫特 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)
   }
}

Swift 4

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

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

在 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。

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

我知道这个问题是针对 Swift 的,但如果有人感兴趣,这里是接受答案的 Xamarin 等效代码。

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

此外,如果您有表视图的部分,则不应尝试查找要刷新的每一行,而应使用重新加载部分。这是一个简单且更平衡的过程:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)
    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()

怎么样:

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

Swift 4.1

使用行的选定标记删除行时使用它。

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)

最新更新