Estoy tratando de implementar el patrón de delegación en Swift. El proceso consiste en un popover que se muestra desde un UIMenuItem en una selección de texto en textView. Este popover es un TableViewController que contiene algunos colores. Cuando se toca una celda (o color), el texto seleccionado cambia su color de negro al color seleccionado. Tengo el siguiente protocolo en la clase de envío:

protocol SelectedColorDelegate {
func didSelectColorCell(color: UIColor)
}

Luego, en la clase de envío, creé esta propiedad:

var colorCellDelegate: SelectedColorDelegate?

En el método didSelectRowAtIndexPath de tableViewController (popover) que es la clase de envío, asigné el parámetro requerido:

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

En mi clase receptora, que es un ViewController, configuré el protocolo SelectedColorDelegate y me ajusté a él con este método, con el objetivo de cambiar el 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
}

Pero el último método nunca se llama, tocar la celda del popover no hace nada, ¿qué me estoy perdiendo o haciendo mal? ¡¡Gracias!! :)

0
Marilyn García 23 dic. 2016 a las 09:15

3 respuestas

La mejor respuesta

En primer lugar, defina su protocolo solo para clases

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

En segundo lugar, queremos que nuestro delegado sea débilmente retenido

weak var colorCellDelegate: SelectedColorDelegate?

Finalmente configure delegado cuando muestre otra vista o en viewDidLoad, por ejemplo:

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

        self.colorCellDelegate = self
    }
}

Tutorial - Cómo hacer delegadas débiles en Swift

4
Adrian Bobrowski 24 dic. 2016 a las 06:40

En PopOverTableViewController, la configuración debería verse así:

class PopOverTableViewController: UITableViewController, SelectedColorDelegate {

    override func viewDidLoad() {
          super.viewDidLoad()
          self.colorCellDelegate = self
    }
}
0
BaSha 23 dic. 2016 a las 07:08

¿Hiciste: xxTableViewController.colorCellDelegate = self en ViewController?

Y su declaración de delegado debe ser débil:

weak var colorCellDelegate: SelectedColorDelegate?
0
Yun CHEN 23 dic. 2016 a las 06:29