รีเฟรชบางแถวของ UITableView ตาม Int ใน Swift


90

ฉันเป็นนักพัฒนาเริ่มต้นใน Swift และฉันกำลังสร้างแอพพื้นฐานที่มี UITableView ฉันต้องการรีเฟรชแถวหนึ่งของตารางโดยใช้:

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

และฉันต้องการให้แถวที่จะรีเฟรชมาจาก Int ชื่อ rowNumber

ปัญหาคือฉันไม่รู้ว่าจะทำอย่างไรและหัวข้อทั้งหมดที่ฉันค้นหาคือ Obj-C

ความคิดใด ๆ ?


มีเพียงมาตราเดียว?
Lyndsey Scott

คำตอบ:


198

คุณสามารถสร้าง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)

ถ้าสำหรับส่วนใดส่วนหนึ่งของแถวจะมีการเปลี่ยนแปลง? @ ลินด์ซีย์สก็อต
จุ่ม

@ ลินด์ซีย์: จริงๆแล้วตอนแรกสมมติว่าฉันมี 2 เซลล์ในส่วนนั้นที่ฉันจะโหลดใหม่หลังจากโหลดซ้ำสมมติว่าฉันจะมีจำนวนเซลล์ (x) จำนวนใด ๆ ในส่วนนั้นดังนั้นคำถามของฉันคืออยู่ในแนวเดียวกัน การคำนวณ indexpath ฉันแน่ใจเกี่ยวกับส่วนนี้ แต่ฉันสับสนกับจำนวนแถวเพราะมันขัดข้องในการเปลี่ยนจำนวนแถว var indexPath = NSIndexPath (forRow: rowNumber, inSection: 0)
จุ่ม

@dip คุณต้องดู tableView ของคุณ: numberOfRowsInSection: อัลกอริทึมวิธีการเพื่อรับข้อมูลนั้น ... ฉันขอแนะนำให้โพสต์คำถามของคุณในฟอรัมเนื่องจากดูเหมือนปัญหาเฉพาะที่คุณมีกับรหัสของคุณ ...
Lyndsey Scott

จะเรียกวิธีนี้ได้ที่ไหน?
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)
   }
}

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 ได้


3

สวิฟต์ 4

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

ทำไมคุณจึงคัดลอกและวางคำตอบของฉัน
Hardik Thakkar

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 of row

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.