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


88

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

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

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

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

有任何想法吗?


只有一节吗?
林德西·斯科特

Answers:


195

您可以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计算的IAM肯定的部分,但我很困惑的行数,因为它崩溃的行数的变化 VAR indexPath = NSIndexPath(forRow:ROWNUMBER,切入口:0)

@dip,您需要查看tableView:numberOfRowsInSection:方法算法以获取该信息...我建议您在论坛上发布您的问题,因为这听起来像是您的代码存在特定问题...
Lyndsey斯科特

在哪里调用此方法?
主AgentX

22

对于软影响动画解决方案:

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

4

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

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

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

怎么样:

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

0

斯威夫特4.1

当您使用row的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

通过编辑请所有澄清添加到您的答案
尼科·哈泽
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.