2016-11-09 15 views
10

Tôi đang phải đối mặt với một vấn đềTạo .xib duy nhất cho các lớp học khác nhau UITableViewCell

Tôi có một tập tin NNVerticalStackTableViewCell.xib và tương ứng NNVerticalStackTableViewCell.swift tệp của nó.

Mã cho NNVerticalStackTableViewCell.swift tập tin

class NNVerticalStackTableViewCell: UITableViewCell 
{ 
    //MARK: Outlets 
    @IBOutlet weak var titleLabel: UILabel! 
    @IBOutlet weak var verticalStack: NNVerticalStackView! 

    //MARK: Internal Properties 
    var titleString : String? 
     { 
     set{ 
      self.titleLabel.text = newValue 
     } 
     get{ 
      return self.titleLabel.text 
     } 
    } 

    //MARK: View Lifecycle Methods 
    override func awakeFromNib() 
    { 
     super.awakeFromNib() 
     self.titleLabel.text = nil 
    } 

    //MARK: Internal Methods 
    func addViewsInVerticalStack(viewsArray : [UIView]) 
    { 
     for view in viewsArray 
     { 
      self.verticalStack.insertStackItem(view) 
     } 
    } 
} 

Interface cho NNVerticalStackTableViewCell.xib tập tin

enter image description here

với class name như: NNVerticalStackTableViewCellcell identifier như: NNVerticalStackTableViewCell

Bây giờ tôi đã tạo ra một lớp con của NNVerticalStackTableViewCell như:

class NNPropertiesUnderProjectTableViewCell: NNVerticalStackTableViewCell 
{ 
    //MARK: Internal Properties 
    var completionHandler : ((NNSearchPreference) -> Void)? 

    //MARK: Internal Methods 
    func configureCell(_ propertiesUnderProjectArray : [[String : Any]]) 
    { 
     var viewsArray = [UIView]() 
     for dict in propertiesUnderProjectArray 
     { 
      let elementView = NNPropertiesUnderProjectElementView.loadFromNib() 
      elementView?.configureViewWith(buttonTitleString: dict["displayString"] as! String, searchPreference: dict["searchPreference"] as! NNSearchPreference, completionHandler: {[weak self] (searchPreference) in 
       if let handler = self?.completionHandler 
       { 
        handler(searchPreference) 
       } 
       }) 
      viewsArray.addObject(elementView) 
     } 
     self.addViewsInVerticalStack(viewsArray: viewsArray) 
    } 
} 

Bây giờ những gì tôi muốn làm là sử dụng NNPropertiesUnderProjectTableViewCell lớp với giao diện NNVerticalStackTableViewCell.xib.

Tương tự như NNPropertiesUnderProjectTableViewCell lớp Tôi có nhiều lớp khác sử dụng cùng một giao diện như NNVerticalStackTableViewCell.xib và tùy chỉnh nó cho phù hợp.

Trong ViewController của tôi, tôi đã đăng ký NNVerticalStackTableViewCell.xib và sau đó tạo ra các tế bào như:

self.tableView.register(UINib(nibName: "NNVerticalStackTableViewCell"), forCellReuseIdentifier: "NNVerticalStackTableViewCell") 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
      let propertiesUnderProjectCell = tableView.dequeueReusableCell(withIdentifier: "NNVerticalStackTableViewCell", for: indexPath as IndexPath) as! NNPropertiesUnderProjectTableViewCell 
    } 

Nhưng, tôi nhận được ngoại lệ:

Could not cast value of type 'NNVerticalStackTableViewCell' (0x100945878) to 'NNPropertiesUnderProjectTableViewCell' (0x100949330). 

bất cứ ai có thể vui lòng đề nghị làm thế nào để giải quyết vấn đề. Tôi muốn sử dụng duy nhất .xib và không muốn lặp lại mã.

+0

Bạn có thể, vui lòng hiển thị ví dụ về nhiều lớp làm việc với cùng một tệp xib? –

Trả lời

5

Bạn có thể, nhưng, thay vì sử dụng UITableViewCell, sử dụng tương tự UIView

Tạo một xib cho xem nội dung di động, cung cấp cho nó một lớp (như CellView). Ở mỗi lớp tế bào, có CellView với loadNibNamed và thiết lập nó như là xem nội dung di động, sau đó bạn có thể tự do thay đổi sở hữu của CellView và sử dụng nó như xem nội dung lớp tế bào của nhau

Có thể có giải pháp tốt hơn, nhưng điều này là làm thế nào tôi làm điều đó cho tương tự như tìm kiếm UIViewController, bạn cũng có thể thử xib tế bào mà không có lớp đặt trong bảng phân cảnh và cố gắng tải nó và xem nếu lỗi vẫn tồn tại hoặc không

1

Về cơ bản, bạn không thể làm chính xác những gì bạn ' đang cố gắng làm vì tên lớp nằm trong XIB nên bạn luôn nhận được một cá thể của lớp cơ sở, không phải bất kỳ lớp con nào của bạn.

Đề xuất từ ​​@ Tj3n là một gợi ý tốt, trích phần chung vào chế độ xem có thể tái sử dụng và trong quá trình khởi tạo siêu lớp của bạn tạo một thể hiện của chế độ xem đó và thêm nó. Bây giờ, khi bạn khởi tạo một lớp con và nó gọi siêu phần tử chung sẽ được khởi tạo và có thể sử dụng được bởi lớp con.

Nói cách khác, hãy sử dụng bố cục để đạt được mục tiêu của bạn, chứ không phải thừa kế.

0

NNPropertiesUnderProjectTableViewCell không đăng ký cho Trình nhận dạng di động.

1

Bạn có thể Làm như thế này nếu bạn muốn sử dụng tableViewCell.xib trong nhiều Thời gian. Đầu tiên Đi tới Tệp và Tạo Tệp Mới (Lớp Cảm ứng Ca cao).

CocoaTouch Class

Tạo TableViewCell tập tin với .xib

TableViewCell

Bây giờ đơn giản Tạo Custom Design your Cell

Design

Bây giờ Thêm mã này trong TableViewCell.swift tập tin của bạn

Image

Bây giờ chỉ cần thêm định danh trong tableView your Cell như thế này (nơi bạn muốn thêm tùy chỉnh này TableviewCell)

cell

Bây giờ chỉ cần mang nó như your Cell Như thế này ..

Table

Và Bingo Bạn đã nhận được nó ..

Bây giờ, chỉ cần thêm ô dưới dạng! TableViewCell trong bất kỳ TableViewController Tệp (Bạn có kết quả tương tự với cùng một thiết kế.)

OutPut1

đây của Nhắp chuột đầu tiên (Tải Đầu tiên TableViewController)

FirstTable

On Nhấn vào thứ hai (Tải Second TableViewController)

SecondTable View

+0

Tôi nghĩ bạn đã không đọc câu hỏi đúng cách.:) – PGDev

3

Bạn không thể làm điều đó vì registerNib: mong đợi cùng một trường hợp của chế độ xem được đăng ký chính xác.

Từ đây bạn có thể làm là nhân rộng NNVerticalStackTableViewCell.xib và giữ lại NNVerticalStackTableViewCell.swift làm lớp cơ sở của bạn.

sau đó tạo một cái gì đó như NNPropertiesUnderProjectTableViewCell.xib nơi nó giữ cùng một chế độ xem như trước đây NNVerticalStackTableViewCell.xib với các điều khiển bổ sung của bạn. Sau đó, phân lớp nó thành với số nhận dạng duy nhất: NNPropertiesUnderProjectTableViewCell.

trong đó NNPropertiesUnderProjectTableViewCell là một subclas của NNVerticalStackTableViewCell.

Từ đây, chỉ cần thêm các điều khiển bổ sung của bạn là duy nhất cho lớp NNPropertiesUnderProjectTableViewCell.

+0

Ya Tôi đã sử dụng cách tiếp cận tương tự. Nhưng tôi đã hy vọng cho một số thay thế. – PGDev

Các vấn đề liên quan