2016-12-23 10 views
0

Я пытаюсь реализовать шаблон делегирования на Swift. Процесс состоит из popover, который отображается из UIMenuItem в текстовом выборе в textView. Этот popover - TableViewController, который содержит некоторые цвета. Когда ячейка (или цвет) используется, выбранный текст меняет цвет с черного на выбранный. У меня есть следующий протокол в передающем классе:Делегация не работает Swift

protocol SelectedColorDelegate { 
func didSelectColorCell(color: UIColor) 
} 

Тогда в передающем классе я создал эту собственность:

var colorCellDelegate: SelectedColorDelegate? 

В методе didSelectRowAtIndexPath в tableViewController (пирог), который является отправкой класса, Я назначил необходимый параметр:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let color = arrayOfColorValues[indexPath.row] 
    self.colorCellDelegate?.didSelectColorCell(color: color) 
} 

в моем приемном классе, который является ViewController я установить SelectedColorDelegate протокола, и соответствовал этим м еню, направленные на изменение TextColor:

func didSelectColorCell(color: UIColor) { 
    let textRange = noteTextView.selectedRange 
    let string = NSMutableAttributedString(attributedString: noteTextView.attributedText) 
    string.addAttribute(NSForegroundColorAttributeName, value: color, range: textRange) 
    noteTextView.attributedText = string 
    noteTextView.selectedRange = textRange 
} 

Но последний метод никогда не вызывается, нажав ячейки в пирог не делает ничего, что я отсутствует или делаю неправильно? Благодаря!! :)

+0

вы можете поставить точку останова в функции с 'didSelectRowAt' и проверить, если он COLLED? –

+0

Вы назначили ViewController для colorCellDelegate? –

+1

popover? .Delegate = self; убедитесь, что вы назначили этих делегатов в Viewcontroller. – Himanshu

ответ

1

Прежде всего определить свой протокол, как только для классов

protocol SelectedColorDelegate: class { 
    func didSelectColorCell(color: UIColor) 
} 

Во-вторых, мы хотим, чтобы наш делегат был слабо сохранил

weak var colorCellDelegate: SelectedColorDelegate? 

Наконец набор делегата, когда вы показываете другой вид или viewDidLoad например:

class YourViewController: SelectedColorDelegate { 
    final override func viewDidLoad() { 
     super.viewDidLoad() 

     self.colorCellDelegate = self 
    } 
} 

Tutorial - How To Make Weak Delegates In Swift

+0

Мне удалось найти свою ошибку, но если я установил делегат в качестве слабой ссылки, компилятор жалуется, заявив, что «слабый может применяться только к типам протоколов класса и класса», а не к простому протоколу, который Я реализовал, поэтому мой протокол должен быть типом только класса. Благодаря! –

+0

@ MarilynGarcía определяет ваш протокол только для классов. Ищите мой отредактированный ответ –

0

Вы сделали: xxTableViewController.colorCellDelegate = self в xxViewController?

И ваше заявление делегат должен быть слабым:

weak var colorCellDelegate: SelectedColorDelegate? 
+0

Возникает ли представление ViewController к colorCellDelegate в viewDidLoad()? –

+0

@ MarilynGarcía, где вы создаете xxTableViewController: пусть xxTableViewController = XXTableViewController(); xxTableViewController.colorCellDelegate = self –

0

В PopOverTableViewController, установка должна выглядеть -

class PopOverTableViewController: UITableViewController, SelectedColorDelegate { 

    override func viewDidLoad() { 
      super.viewDidLoad() 
      self.colorCellDelegate = self 
    } 
}