2016-11-09 2 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 как: NNVerticalStackTableViewCell и cell identifier как: NNVerticalStackTableViewCell

Теперь я создал подкласс 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) 
    } 
} 

Теперь то, что я хочу сделать, это использовать NNPropertiesUnderProjectTableViewCell класс с NNVerticalStackTableViewCell.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

Можете ли вы показать пример нескольких классов, работающих с одним и тем же файлом xib? –

ответ

5

Вы можете, но, вместо того чтобы использовать UITableViewCell, использовать аналогичный UIView

Создать XIB для представления содержимого ячейки, дать ему класс (как CellView). В каждом классе клеток, получить CellView с loadNibNamed и установить его в качестве представления содержимого ячейки, то вы можете свободно изменять свойство CellView и использовать его в качестве представления содержимого другого класса клетки

Может быть, есть лучшее решение, но это как я это делаю для аналогичного вида UIViewController, вы также можете попробовать ячейку xib без набора классов в раскадровке и попытаться загрузить ее и посмотреть, сохраняется ли ошибка или нет.

1

В принципе, вы не можете точно определить, re, потому что имя класса находится в XIB, поэтому вы всегда получаете экземпляр базового класса, а не какой-либо из ваших подклассов.

Предложение от @ Tj3n является хорошим, извлечь общую часть в многоразовое представление и в вашей инициализации суперкласса создать экземпляр этого представления и добавить его. Теперь, когда вы создаете экземпляр подкласса и называет super, общий элемент будет инициализироваться и использоваться подклассом.

Другими словами, используйте композицию для достижения своей цели, а не наследования.

0

NNPropertiesUnderProjectTableViewCell не зарегистрирован для Cellidentifier.

1

Вы можете сделать это, если хотите использовать tableViewCell.xib за несколько раз. Сначала зайдите в файл и создайте новый файл (класс Touch Cocoa).

CocoaTouch Class

Создать TableViewCell Файл с .xib

TableViewCell

Теперь просто создать свой собственный сотовый дизайн

Design

Теперь Добавьте этот код в TableViewCell.swift файла

Image

Теперь просто добавьте идентификатор в вашей Tableview Cell, как это (где вы хотите добавить этот обычай TableviewCell)

cell

Теперь просто взять его как мобильный Как это ..

Table

И Бинго понял ..

Теперь просто добавьте ячейку как! TableViewCell в любом TableViewController File (Вы получили тот же результат с той же дизайн.)

OutPut1

здесь Нажмите First (Load First TableViewController)

FirstTable

На Нажмите Второй (Load Second TableViewController)

SecondTable View

+0

Думаю, вы не правильно прочитали вопрос.:) – PGDev

3

Вы не можете этого сделать, поскольку registerNib: ожидает тот же экземпляр точного зарегистрированного вида.

Здесь вы можете сделать репликацию NNVerticalStackTableViewCell.xib и сохранить NNVerticalStackTableViewCell.swift в качестве базового класса.

затем создайте что-то вроде NNPropertiesUnderProjectTableViewCell.xib, где он имеет тот же вид, что и раньше NNVerticalStackTableViewCell.xib с добавленными элементами управления. Затем подклассируем его до с уникальным идентификатором: NNPropertiesUnderProjectTableViewCell.

, в котором NNPropertiesUnderProjectTableViewCell является подклассом NNVerticalStackTableViewCell.

Отныне добавьте дополнительные элементы управления, уникальные для класса NNPropertiesUnderProjectTableViewCell.

+0

Я использовал тот же подход. Но я надеялся на какую-то альтернативу. – PGDev

Смежные вопросы