2014-09-16 27 views
18

Tôi có một lớp con tùy chỉnh UITableViewCell và xib liên quan của nó. Tôi có một số UILabelUIButton trong ô này và tôi đã kết nối thao tác bên trong của nút với lớp con.Lấy IndexPath từ bên trong một lớp con UITableViewCell trong Swift

Điều tôi cần là khi nút đó trong ô được nhấn, để có được đường dẫn chỉ mục của ô có nút đó. Và có thể gửi lại cho bộ điều khiển xem thông qua một đại biểu hoặc một cái gì đó.

Vì tôi ở trong lớp con UITableViewCell, tôi không thể sử dụng giải pháp như this vì tôi không có tham chiếu đến chế độ xem bảng từ bên trong lớp con của ô. Khi điều tra thêm, tôi tìm thấy giải pháp another và tôi đã triển khai nó trong Swift như thế này.

import UIKit 

class ContactCell: UITableViewCell { 

    @IBOutlet weak var nameLabel: UILabel! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
     selectionStyle = .None 
    } 

    @IBAction func callButtonPressed(sender: UIButton) { 
     let indexPath = (self.superview as UITableView).indexPathForCell(self) 
     println("indexPath?.row") 
    } 

} 

Nhưng khi tôi gõ vào nút này, nó bị treo với một thông báo lỗi nói rằng cast động Swift thất bại.

Bất kỳ ý tưởng nào có vấn đề với mã của tôi?

Hoặc tôi mở cho bất kỳ đề xuất nào khác cho phép tôi đạt được kết quả mong muốn theo bất kỳ cách nào khác.

Cảm ơn bạn.

+0

Âm thanh như bạn cần một đại biểu: http://stackoverflow.com/questions/24099230/delegates-in-swift – ullstrm

+0

Lý do để bạn biết indexPath liên quan là gì? 'println (" indexPath? .row ")' rõ ràng không phải là một lý do thực sự. Mô hình đằng sau tất cả điều đó là gì? –

+0

@POB Lý do là tôi đã đưa ra các phương pháp nguồn dữ liệu của tableview và đặt chúng vào một lớp tái sử dụng riêng biệt như được mô tả trong [this] (http://www.objc.io/issue-1/lighter-view-controllers. html) bài viết. Ô tuỳ chỉnh của tôi có một nút và bây giờ tôi cần lấy đường dẫn chỉ mục của ô mà nút được nhấn. – Isuru

Trả lời

19

Âm thanh như bạn cần một đại biểu:

Delegates in swift?

Sau đó chỉ cần vượt qua các tế bào chính nó như là một tham số để các đại biểu, và sau đó bạn có thể dễ dàng làm tableView.indexPathForCell(cellFromDelegateMethod)

+0

Tôi đã đạt được điều này bằng cách sử dụng các đại biểu. Cảm ơn bạn. – Isuru

2

UIButton.Type thực sự không có người giám sát thành viên, nhưng người gửi có

var cell: UITableViewCell = sender.superview.superview as UITableViewCell

+0

Đây là một cách tuyệt vời để làm điều đó nếu sử dụng chế độ xem bộ sưu tập được nhúng trong chế độ xem bảng và bạn muốn bật tương tác cho các nút trong ô xem bộ sưu tập nhưng vẫn cho phép ô thu thập xem nhúng phân tách các mục tableview chính xác – Tom

2

Hey bạn có thể sử dụng "Tag" của nút cũng. Bên trong phương thức cellForRowAt của bảng delegate u có thể gắn thẻ nút với Indexpath.row. đây là ví dụ mà tôi đã cố gắng nói.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
// get ur cell nib .As it has a button 
cell.startOrConntinuBtn.addTarget(self, action: #selector(sumbitOrContinue), for: .touchUpInside) 

cell.startOrConntinuBtn.tag = indexPath.row } 

và trong phương thức liên lạc "sumbitOrContinue" -

func sumbitOrContinue(sender: UIButton!) { 
let tag = sender.tag 
// do what you want to do like this example 

let detail = self.detailList[tag] 
let vc = self.storyboard?.instantiateViewController(withIdentifier: "mockExamInt") as! MockWindowVc 
vc.detailId = detail.id 
self.navigationController?.pushViewController(vc, animated: true)} 
Các vấn đề liên quan