2014-06-28 34 views
20

Nếu tôi bỏ ghi chúLàm thế nào để sử dụng dequeueReusableCellWithIdentifier trong Swift?

tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) 

tôi nhận được một lỗi trên dòng

let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 

nói rằng UITableView? does not have a member named 'dequeueReusableCellWithIdentifier'

Nếu tôi unwrap tableview thì lỗi sẽ biến mất, nhưng trong Objective-C chúng tôi thường sẽ kiểm tra xem tế bào có tồn tại hay không và nếu chúng ta không tạo ra một ô mới. Trong Swift, vì boilerplate được cung cấp sử dụng từ khóa let và unwraps một tùy chọn, chúng tôi không thể gán lại nó nếu nó là không.

Cách thích hợp để sử dụng dequeueReusableCellWithIdentifier trong Swift là gì?

+0

liên quan đến các tế bào có thể là con số không. không có phương pháp này. Phương pháp này luôn luôn trả về một ô hợp lệ " –

+0

Tôi lẫn lộn vì tôi nhớ những ngày ObjC nơi bạn kiểm tra nil trong trường hợp không có ô để tái sử dụng, và nếu nil tạo một ô có 'reuseIdentifier'. Tôi đọc tài liệu Apple hiện tại một lần nữa và nó nói "Phương pháp này dequeues một tế bào hiện có nếu một là có sẵn hoặc tạo ra một cái mới bằng cách sử dụng lớp hoặc tập tin nib bạn đã đăng ký trước đó." Vì vậy, chức năng hiện cả hai cho chúng tôi bây giờ, đó là tốt đẹp. Xem thảo luận này mặc dù, có 2 cuộc gọi dequeue - một trả về tùy chọn, khác không: [link] (https://www.natashatherobot.com/ios-using-the-wrong-dequeuereusablecellwithidentifier/) –

Trả lời

32

Bạn ngầm có thể unwrap các tham số để phương pháp này và cũng có thể đúc kết quả của dequeueReusableCellWithIdentifier để cung cấp cho đoạn code ngắn gọn như sau:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell 

    //configure your cell 

    return cell 
} 
+3

Đây là câu trả lời tôi có thể làm với - sự khác biệt chính là việc sử dụng '!' (Đối với tùy chọn không được khai báo hoàn toàn) thay vì '?' Trong định nghĩa hàm (chỉ cần trỏ nó ra cho những người không thông báo ngay lập tức) Sự khác biệt). Tôi cũng nghĩ rằng các boilerplate được cung cấp bởi Apple trong XCode 6 sẽ thay thế định nghĩa của họ với điều này là tốt. – JuJoDi

5

Bạn cần phải unwrap biến tableView vì nó là một tùy chọn

if let realTableView = tableView { 
    let cell = realTableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 
    // etc 
} else { 
    // tableView was nil 
} 

hoặc bạn có thể rút ngắn nó bằng cách

tableView?.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 

Trong câu trả lời cho câu hỏi của bạn về 'trong Objective-C chúng ta sẽ thường kiểm tra xem ô có tồn tại hay không và nếu chúng ta không tạo ô mới ', dequeueReusableCellWithIdentifier luôn trả về một ô (miễn là bạn đã đăng ký một lớp hoặc một chữ cái cho mã định danh này), vì vậy bạn không cần để tạo một cái mới.

+0

dequeueReusableCellWithIdentifier không phải luôn luôn trả lại một ô, tài liệu cf – greg3z

+0

Xin lỗi, tôi có nghĩa là luôn trả về một ô nếu bạn đã thiết lập chính xác.Tôi đã chỉnh sửa nó để được rõ ràng hơn – iain

+0

Nếu bạn sử dụng phương pháp này trong cellForAtIndexPath, làm thế nào để bạn trở lại tế bào? – senty

24

Nếu loại tế bào chưa được đăng ký với xem bảng trước khi bàn tải, bạn có thể sử dụng sau đây để lấy một ví dụ tế bào:

private let cellReuseIdentifier: String = "yourCellReuseIdentifier" 

// MARK: UITableViewDataSource 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) 
    if (cell == nil) { 
    cell = UITableViewCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:cellReuseIdentifier) 
    } 
    cell!.textLabel!.text = "Hello World" 
    return cell! 
} 
+0

Cung cấp cảnh báo nhanh chóng 2.0: 'Điều kiện truyền từ 'UITableViewCell' thành 'UITableViewCell' luôn thành công ' –

+0

Chỉ cần xóa' như?' – Zorayr

+0

Có, và tôi nghĩ câu lệnh if if (cell == nil) {' ... cũng nên được loại bỏ. Nó đưa ra một lỗi khi ô không thuộc loại tùy chọn. –

2

nhanh chóng 3 phiên bản:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath!) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier:"CellIdentifier", for: indexPath) as UITableViewCell 
     return cell 
    } 
1

Trong Swift 3 và Swift 4 Version bạn chỉ cần sử dụng này

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath as IndexPath) as UITableViewCell 
     cell.textLabel?.text = "cell number \(indexPath.row)." 

     //cell code here 

     return cell 
    } 

Trong Swift 2 Version

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell 

cell.textLabel?.text = "cell number \(indexPath.row)." 

     //cell code here 

     return cell 
    } 
Các vấn đề liên quan