Bạn có thể sử dụng delegation pattern. Giả sử rằng bạn đã triển khai một ô bảng tùy chỉnh, bạn có thể định nghĩa một thuộc tính trong lớp của nó để giữ bất kỳ thứ gì bạn nghĩ là hữu ích để xác định hàng - nó có thể là chỉ mục của nó, hoặc (cách ưa thích của tôi) một thể hiện của một lớp đại diện cho Dữ liệu được hiển thị trong ô (Tôi gọi nó là MyCellData
.
Ý tưởng là để cho ô thông báo cho bộ điều khiển xem bảng về một lần nhấn vào nút đó, chuyển dữ liệu liên quan về (dữ liệu được hiển thị trong) hàng. Bảng điều khiển xem sau đó khởi chạy một segue, và trong phương thức prepareForSegue
ghi đè nó lưu trữ dữ liệu được truyền qua ô tới bộ điều khiển đích. Nếu bạn phải hiển thị dữ liệu chi tiết về hàng, bạn có tất cả thông tin liên quan, chẳng hạn như bản thân dữ liệu chi tiết hoặc bộ nhận dạng mà trình điều khiển chế độ xem đích có thể sử dụng để truy xuất dữ liệu ví dụ từ cơ sở dữ liệu cục bộ hoặc dịch vụ từ xa.
Xác định một giao thức:
protocol MyCellDelegate {
func didTapMilk(data: MyCellData)
}
sau đó khai báo một tài sản có tên delegate
trong lớp tế bào, và gọi phương thức didTapMilk
của nó từ IBAction
class MyTableCell : UITableViewCell {
var delegate: MyCellDelegate?
var data: MyCellData!
@IBAction func didTapMilk() {
if let delegate = self.delegate {
delegate.didTapMilk(self.data)
}
}
}
Tiếp theo, thực hiện các giao thức theo quan điểm bảng của bạn bộ điều khiển, cùng với ghi đè prepareForSegue
extension MyTableViewController : MyCellDelegate {
func didTapMilk(data: MyCellData) {
performSegueWithIdentifier("mySegueId", sender: data)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "mySegueId" {
let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController
vc.data = sender as? MyCellData
}
}
}
Tất nhiên bạn cần một tài sản data
trên bộ điều khiển xem đích để làm việc. Như đã đề cập ở trên, nếu nó hiển thị chi tiết về hàng, bạn có thể nhúng tất cả dữ liệu cần thiết vào lớp MyCellData
của bạn - hoặc ít nhất là những gì bạn cần để lấy dữ liệu từ bất kỳ nguồn nào (chẳng hạn như một DB cục bộ, dịch vụ từ xa, v.v.)
ngoái, trong cellForRowAtIndexPath, lưu trữ dữ liệu trong tế bào và thiết lập của nó delegate
tài sản để self
:
extension MyTableViewController : UITableViewDataSource {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell
let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell
cell.data = data
cell.delegate = self
// ... other initializations
return cell
}
}
Được rồi tôi đã kiểm soát và bây giờ khi tôi nhấp vào nút ứng dụng gặp sự cố trên dòng đầu tiên của AppDelegate với "SIGABRT" – skyguy
Không sao, tôi nhận được nó – skyguy
Tôi nghĩ rằng nó phải là ** self.performSegueWithIdentifier ("about", người gửi : người gửi)** – Mehmet