2014-10-18 14 views
6

Tôi có một số UITableView với nhiều ô khác nhau, dựa trên những gì trong mảng nội dung của nguồn dữ liệu mà chúng sẽ hiển thị nội dung tùy chỉnh.Làm cách nào để truyền chính xác tới lớp con trong Swift?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell : UITableViewCell? = nil 
     let objectAtIndexPath: AnyObject = contentArray![indexPath.row] 

     if let questionText = objectAtIndexPath as? String { 
      cell = tableView.dequeueReusableCellWithIdentifier("questionCell", forIndexPath: indexPath) as QuestionTableViewCell 
      cell.customLabel.text = "test" 
     } 

     return cell! 
    } 

Ở đây tôi nhận được lỗi đó

UITableViewCell does not have the attribute customLabel

QuestionTableViewCell không có. Có vấn đề gì với dàn diễn viên của tôi là QuestionTableViewCell?

Trả lời

22

Vấn đề không phải là diễn viên của bạn mà là tuyên bố của bạn là cell. Bạn đã khai báo nó như là một UITableViewCell tùy chọn và khai báo đó vẫn còn mãi mãi - và tất cả những gì trình biên dịch biết.

Vì vậy, bạn phải truyền tại thời điểm cuộc gọi đến customLabel. Thay vì điều này:

cell.customLabel.text = "test" 

Bạn cần điều này:

(cell as QuestionTableViewCell).customLabel.text = "test" 

Bạn có thể làm cho điều này dễ dàng hơn trên chính mình bằng cách tuyên bố một khác nhau biến (kể từ khi bạn biết rằng trong trường hợp đặc biệt này di động của bạn sẽ là một QuestionTableViewCell), nhưng miễn là bạn sẽ chỉ có một biến, cell, bạn sẽ phải liên tục truyền nó đến bất kỳ lớp nào bạn tin rằng nó thực sự sẽ là. Cá nhân, tôi đã viết một cái gì đó giống như thế này, chính xác để tránh việc lặp lại việc truyền đó:

if let questionText = objectAtIndexPath as? String { 
     let qtv = tableView.dequeueReusableCellWithIdentifier("questionCell", forIndexPath: indexPath) as QuestionTableViewCell 
     qtv.customLabel.text = "test" 
     cell = qtv 
    } 
+0

Hoặc 'trở lại qtv' trong if-block và thả các tế bào' 'biến. –

+0

@MartinR Phải nhưng tôi giả định anh ta có thể không được thực hiện cấu hình ô; có thể có các cấu hình phổ biến sau này.Ông đã chỉ rõ ràng chỉ là một phần nhỏ của một bộ lớn hơn nhiều cấu hình tế bào có điều kiện (mà ông nên sử dụng một 'switch', không phải là một loạt các câu lệnh' if', nhưng đó là một câu chuyện khác). – matt

-5

bạn có thể làm bất kỳ một trong các cách sau:

  1. thay thế: cell.customLabel.text = "test"

    với

    cell?.customLabel.text = "text1" 
    
  2. thay đổi var cell : UITableView? = nil để var cell : UITableView!

+0

'cell' là một 'UITableViewCell' không phải là một' UITableView'. Nhưng ngay cả sau đó, tất cả các thay đổi được đề xuất của bạn sẽ không giải quyết được lỗi trình biên dịch. –

+0

Kính gửi Martin, đây không phải là trường hợp, tế bào thực sự là uitableviewcell, và trong trường hợp này nó là một unwrap buộc với? – ZAZ

+0

Có, ô phải là UITableViewCell, nhưng * mã của bạn * tuyên bố nó là UITableView. Nhưng vấn đề không phải là mở rộng. Vấn đề là trình biên dịch không biết rằng 'ô' có thuộc tính' customLabel'. –

1

Vấn đề là var cell : UITableViewCell? = nil. Bạn tuyên bố nó là UITableViewCell? và nó có loại đó mãi mãi.

Bạn có thể khai báo một biến khác

let questionCell = cell as! QuestionTableViewCell 
questionCell.customLabel.text = "test" 
Các vấn đề liên quan