2016-11-09 48 views
10

單一的.xib我面臨的一個問題創建不同的UITableViewCell類

我有一個NNVerticalStackTableViewCell.xib文件及其相應NNVerticalStackTableViewCell.swift文件。

代碼NNVerticalStackTableViewCell.swift文件

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) 
     } 
    } 
} 

接口NNVerticalStackTableViewCell.xib文件

enter image description here

class name爲:NNVerticalStackTableViewCellcell identifier爲:NNVerticalStackTableViewCell

現在我創建的一個子類爲:

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) 
    } 
} 

現在我想要做的就是使用NNPropertiesUnderProjectTableViewCellNNVerticalStackTableViewCell.xib接口。

類似於NNPropertiesUnderProjectTableViewCell類我有很多其他類使用與NNVerticalStackTableViewCell.xib相同的接口並相應地對其進行自定義。

在我ViewController,我註冊NNVerticalStackTableViewCell.xib然後創建單元爲:

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 
    } 

但是,我得到異常:

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

任何人都可以請建議如何解決這個問題。我想使用單個.xib並且不想重複該代碼。

+0

你能不能請,顯示多個教學班,同一廈門國際銀行文件上工作的例子嗎? –

回答

5

你可以,但是,而是採用了UITableViewCell,使用類似UIView

創建單元格內容視圖中的廈門國際銀行,給它一個類(如CellView)。 在每個單元級,獲得CellViewloadNibNamed並將其設置爲單元格內容觀點,那麼你可以隨意改變CellView的財產,並把它作爲其他細胞類的內容視圖

也許有更好的解決辦法,但是這是我如何做類似的看UIViewController,你也可以嘗試單元格xib沒有在故事板設置類,並嘗試加載它,看看是否仍然存在錯誤

1

基本上,你不能完全做你的'重試,因爲類名在XIB中,所以你總是得到一個基類的實例,而不是你的任何子類。

來自@ Tj3n的建議是一個很好的建議,將公共部分提取到可重用視圖中,並在您的超類初始化中創建該視圖的實例並添加它。現在,當你實例化一個子類並調用super時,這個通用元素將被子類初始化和使用。

換句話說,使用組合來實現您的目標,而不是繼承。

0

NNPropertiesUnderProjectTableViewCell未註冊的Cellidentifier。

1

如果你想在多個時間使用tableViewCell.xib你可以這樣做。 首先轉到文件並創建新文件(Cocoa Touch Class)。

CocoaTouch Class

創建TableViewCell文件使用的.xib

TableViewCell

現在簡單了創建自定義的單元設計

Design

現在您的文件TableViewCell.swift添加該代碼

Image

現在只需在您的tableView細胞添加標識所示(這裏要添加這個定製TableviewCell)

cell

現在只是把它作爲你的手機這樣的..

Table

和賓果你知道了..

現在只需添加小區! TableViewCell任何TableViewController文件(你得有相同的設計相同的結果。)

OutPut1

這裏的點擊優先(首先加載TableViewController)

FirstTable

上點擊二(負載二TableViewController)

SecondTable View

+0

我認爲你沒有正確地閱讀這個問題。:) – PGDev

3

你不能這樣做,因爲registerNib:期望具有相同的實際註冊視圖。

從這裏你可以做的是複製NNVerticalStackTableViewCell.xib並保留NNVerticalStackTableViewCell.swift作爲你的基類。

然後創建類似於NNPropertiesUnderProjectTableViewCell.xib的地方,其中包含與之前的NNVerticalStackTableViewCell.xib完全相同的視圖並添加了控件。然後用一個唯一的標識符將其分類到:NNPropertiesUnderProjectTableViewCell

其中NNPropertiesUnderProjectTableViewCellNNVerticalStackTableViewCell一個subclas。

從這裏出發,只需添加額外的控制獨特的NNPropertiesUnderProjectTableViewCell類。

+0

雅我用了同樣的方法。但我希望有一些選擇。 – PGDev