2016-06-06 4 views
0

Я использую определенные компоненты пользовательского интерфейса в моем классе ячеек, и я хочу настроить их в методе willDisplayCell. Оригинальное определениеХотите переопределить метод willDisplayCell в Swift. Как переопределить методы класса

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

Теперь с помощью cell.myTextField.text = "customise" выдает ошибку, что ячейка не имеет какой-либо компонент, как MyTextField

, чтобы решить эту проблему, мне придется переопределить метод

public func tableView(tableView: UITableView, willDisplayCell cell: **myCustomCellClass**, forRowAtIndexPath indexPath: NSIndexPath) 

Любые приводит к тому, как это сделать, а затем как переопределить любые текущие методы класса в swift. Заранее спасибо.

+0

это протокол с полной логикой реализации в зависимости от вас. Как вы собираетесь переопределить его? –

ответ

4

К сожалению, вы не можете изменить тип параметра, потому что изменить бы интерфейс. Вы можете уйти с изменением возвращаемого типа метода на подтип, но вы не можете изменить параметр метода на подтип.

У вас есть один вариант действительно, динамичный бросок:

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    // use as? or as! to cast UITableViewCell to your desired type 
} 

Конечно, вы можете сделать то же самое несколькими способами, например, вы можете создать метод перенаправления:

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    self.tableView(tableView, willDisplayMyCell: cell as! MyCellClass, forRowAtIndexPath: indexPath) 
} 

private func tableView(tableView: UITableView, willDisplayMyCell myCell: MyCellClass, forRowAtIndexPath indexPath: NSIndexPath) { 
    // do something 
} 

и вы можете абстрактный, что в подпротокол из UITableViewDelegate:

class MyTableViewCell : UITableViewCell { 

} 

protocol MyTableViewDelegate : UITableViewDelegate { 
    associatedtype CellClass: UITableViewCell 

    func tableView(
     tableView: UITableView, 
     willDisplayMyCell cell: CellClass, 
     forRowAtIndexPath indexPath: NSIndexPath) 
    } 

extension MyTableViewDelegate { 
    func tableView(
     tableView: UITableView, 
     willDisplayCell cell: UITableViewCell, 
     forRowAtIndexPath indexPath: NSIndexPath) { 

     self.tableView(tableView, willDisplayMyCell: cell as! CellClass, forRowAtIndexPath: indexPath) 
    }  
} 

Прохладных тонкое g об этом заключается в том, что протокол является многоразовым, однако все это сводится к as? или as! динамическим приводом.

+0

Так что я не могу переопределить определение существующего метода класса фундамента? Я не уверен, но окажу помощь в любом случае для достижения этого? – Vkharb

+0

@Vkharb Конечно, вы не можете (кстати, это не метод класса, это метод экземпляра). Неважно, находится ли он в Foundation или UIKit, если это ваш собственный метод. Протокол определяет интерфейс, и если вы хотите изменить интерфейс, вы должны изменить обе стороны, которые его используют (то есть, реализация UITableView). Единственное, что вы можете сделать, - это абстрагировать это кастинг в помощнике, вы не можете изменить интерфейс (типы методов), не переосмысливая «UITableView». – Sulthan

2

Вы должны бросить клетку вашего типа внутри функции

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 
{ 
    if let myCell = cell as? **myCustomCellClass** 
    { 
     //perform your code to cell 
    } 
} 
+1

или 'guard let cell = cell as? ** myCustomCellClass ** else {return} ' – Sulthan

0

Сast клеток из UITableViewCell типа к вашему типу клеток

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 

    if let aCell = cell as? YourCellClass { 
     aCell.myTextField.text = "customise" 
    } 
} 
+0

Тот же ответ, что и мой, через 2 минуты. И проголосовали. В самом деле? –

+0

Прошу прощения, нет копии-вставки, я думаю, мы отвечали в то же время;) –