Làm mới hàng nhất định của UITableView dựa trên Int trong Swift


88

Tôi là một nhà phát triển mới bắt đầu về Swift và tôi đang tạo một ứng dụng cơ bản bao gồm UITableView. Tôi muốn làm mới một hàng nhất định của bảng bằng cách sử dụng:

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

và tôi muốn hàng sẽ được làm mới từ một rowNumber có tên Int

Vấn đề là, tôi không biết làm thế nào để thực hiện việc này và tất cả các chuỗi tôi đã tìm kiếm đều dành cho obj-C

Có ý kiến ​​gì không?


Chỉ có một phần?
Lyndsey Scott

Câu trả lời:


195

Bạn có thể tạo NSIndexPathbằng cách sử dụng số hàng và phần sau đó tải lại nó như sau:

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

Trong ví dụ này, tôi đã giả định rằng bảng của bạn chỉ có một phần (tức là 0) nhưng bạn có thể thay đổi giá trị đó cho phù hợp.

Cập nhật cho Swift 3.0:

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

nếu đối với phần cụ thể số hàng sẽ được thay đổi thì? @Lyndsey Scott
giảm

@Lyndsey: Thực ra lúc đầu, hãy nói rằng tôi có 2 ô trong phần đó mà tôi sẽ tải lại, sau khi tải lại, hãy nói rằng tôi sẽ có bất kỳ (x) số ô nào trong phần cụ thể đó, vì vậy câu hỏi của tôi là tính toán đường dẫn chỉ mục, tôi chắc chắn về phần này nhưng tôi nhầm lẫn về số lượng hàng, vì nó bị lỗi khi thay đổi số hàng var indexPath = NSIndexPath (forRow: rowNumber, inSection: 0)
dip

@dip, bạn cần xem thuật toán tableView: numberOfRowsInSection: method để lấy thông tin đó ... Tôi khuyên bạn nên đăng câu hỏi của mình lên diễn đàn vì nó có vẻ như một vấn đề cụ thể mà bạn đang gặp phải với mã của mình ...
Lyndsey Scott

Gọi phương pháp này ở đâu?
Master AgentX

22

Đối với giải pháp hoạt ảnh tác động mềm:

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)

Đây là một cách khác để bảo vệ ứng dụng khỏi sự cố:

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

4

Swift 4

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

2

Trong 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, nếu bạn chỉ có một phần trong TableView, thì bạn có thể đặt giá trị phần bằng 0.


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

1
Xin chào, Chào mừng bạn đến với Stack Overflow và cảm ơn vì câu trả lời đầu tiên của bạn. Để làm cho câu trả lời hữu ích hơn đối với người khác, cách tốt nhất là chú thích câu trả lời của bạn bằng văn bản giải thích lý do tại sao câu trả lời giải quyết câu hỏi ban đầu của 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

Ngoài ra, Nếu bạn có các phần cho chế độ xem bảng, bạn không nên cố gắng tìm mọi hàng mà bạn muốn làm mới, bạn nên sử dụng tải lại các phần. Đó là quá trình dễ dàng và cân bằng hơn:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)


0

Swift 4.1

sử dụng nó khi bạn xóa hàng bằng thẻ đã chọn của hàng.

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

Tôi nhận thấy câu hỏi này dành cho Swift, nhưng đây là mã tương đương Xamarin của câu trả lời được chấp nhận nếu ai đó quan tâm.

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

Tôi thấy mình ở trong một tình huống cụ thể. Mục tiêu chính của tôi là hoàn thành điều đó khi người dùng ở trong một ô. Và tôi đã thực hiện một số sửa đổi. Bạn chỉ có thể cập nhật ô có trong đó mà không cần tải toàn bộ bảng và gây nhầm lẫn cho người dùng. Vì lý do này, hàm này tận dụng các thuộc tính của tableView, thêm một Nạp lại dữ liệu tùy chỉnh. Và thêm tableview.reloadDataSavingSelecctions (). Ở đâu, bạn thực hiện một số hành động. Và một khi tôi đã làm, tôi muốn chia sẻ giải pháp đó với bạn.
irwin B

Vui lòng thêm tất cả sự làm rõ cho câu trả lời của bạn bằng cách chỉnh sửa nó
Nico Haase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.