SwiftのIntに基づいてUITableViewの特定の行を更新します


88

私はSwiftの最初の開発者であり、UITableViewを含む基本的なアプリを作成しています。次を使用して、テーブルの特定の行を更新したいと思います。

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

更新される行は、rowNumberという名前のIntからのものにする必要があります

問題は、これを行う方法がわからず、検索したすべてのスレッドがObj-C用であるということです。

何か案は?


セクションは1つだけですか?
リンゼイスコット2015

回答:


195

NSIndexPath行とセクション番号を使用して作成し、次のように再読み込みできます。

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

この例では、テーブルに1つのセクション(つまり0)しかないことを前提としていますが、それに応じてその値を変更できます。

Swift 3.0のアップデート:

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

特定のセクションの行数が変更される場合は?@Lyndsey Scott
ディップ

@Lyndsey:実際、最初はそのセクションに2つのセルがあり、そのセクションをリロードするとします。リロードした後、その特定のセクションに任意の(x)個のセルがあるとしましょう。私の質問は次の行にあります。 indexpathの計算、セクションについては確かですが、行数の変更時にクラッシュするため、行数で混乱しています var indexPath = NSIndexPath(forRow:rowNumber、inSection:0)
ディップ

@dipは、その情報を取得するためにtableView:numberOfRowsInSection:メソッドアルゴリズムを確認する必要があります...コードで発生している特定の問題のように思われるため、フォーラムに質問を投稿することをお勧めします...
Lyndseyスコット

このメソッドをどこで呼び出すのですか?
マスターエージェントX19年

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)

これは、アプリをクラッシュから保護するもう1つの方法です。

スウィフト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

Swift3.0では

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

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

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

デフォルトでは、TableViewにセクションが1つしかない場合は、セクション値を0にすることができます。


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

1
こんにちは、StackOverflowへようこそ。最初の回答ありがとうございます。回答を他の人にとってより役立つものにするために、OPの元の質問に対処する理由を説明するテキストで回答に注釈を付けることをお勧めします。
スパンゲン2018年

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

この質問は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

編集して、すべての説明を回答に追加してください
Nico Haase
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.