No se puede conectar el delegado de la propiedad de CustomView declarado como @IBOutlet aViewController en el Interface Builder – simplemente no puede establecer una conexión.

Aquí está el código

class CustomView: UIView {
     @IBOutlet var delegate: CustomViewDelegate?
}

@objc protocol CustomViewDelegate {
     ...
}


class ViewController: UIViewController, CustomViewDelegate {
     ...
}

@objc se utiliza debido a swift protocolo, IBOutlet de la propiedad no puede tener la no-tipo de objeto, no sé por qué protocol CustomViewDelegate: class {} no funciona.

Nadie vino a través de algo como eso?

  • ¿Su UIViewController en el Interface Builder tiene su clase configurada específicamente para ViewController? También, es normalmente un requisito (última vez que lo comprobé) que @IBOutlet propiedades se definen como implícitamente envueltos tipos, así: CustomViewDelegate!. Esto les permite ser nil en la creación de instancias, a la vez que permite su utilización sin opcionales de unión después de que se hayan conectado.
InformationsquelleAutor Dmitry | 2014-10-03

6 Comentarios

  1. 58

    Desde el Xcode notas de la versión:

    Interface Builder, no admite la conexión a una toma de corriente en un Swift archivo cuando la salida es un tipo de protocolo.

    Solución: Declarar la toma de corriente del tipo como AnyObject o NSObject, conectar objetos a la toma de corriente utilizando el Interface Builder, a continuación, cambie la toma de corriente del tipo a del protocolo.

    EDICIÓN: Xcode 9 beta 3 notas de la versión de decir que esta solución ya no debería ser necesario.

    • Wowzer! Esto funcionó, gracias. Apple… por favor, hacerlo juntos!
    • Nope. «La clase no es la clave-valor compliant» después de que el cambio en el tipo de Protocolo.
    • Esto sólo parcialmente trabajado para mí. En un caso, donde he definido mi propio delegado en un UIView para ser conectado a un UIViewController, funcionó. En otro, donde puedo definir mi delegado en un UIViewController para ser conectado a otro UIViewController, no. He intentado muchas configuraciones. Cualquier idea @matt lo que puede estar pasando aquí?
    • «En otro, donde puedo definir mi delegado en un UIViewController para ser conectado a otro UIViewController, no» Eso no tiene sentido para mí, @josephap. Usted puede nunca dibujar una conexión de salida de alguna tipo de un controlador de vista a otro punto de vista controlador en un storyboard, así que me puedo imaginar lo que estaba tratando de hacer en el primer lugar. Esto no tiene nada que ver con Swift en todo. Es sólo un hecho acerca de cómo puntas de trabajo. – Ver mi libro: apeth.com/iOSBook/ch07.html#SECconnectionBetweenNibs
    • Sí, Matt, ahora me doy cuenta. No he utilizado los Storyboards mucho, y acabo de enterar de que sólo se puede conectar enchufes a la vista de los controladores, no entre ellos. Yo, por separado, tienen una rápida relacionados con el problema de que su respuesta ayudó con. Gracias.
    • Ahora estoy roto como para saber si debía volver a Objective-C y/o zanja de storyboards en favor de código puro. La principal razón por la que estoy usando storyboards en este momento es porque estoy escribiendo un Cacao de la aplicación y sólo tengo experiencia con iOS. También es bueno para desarrollar subvistas con @IBDesignable.
    • Es de febrero de 2016 y aún no se soluciona. Por suerte existe esta solución.
    • Xcode 7.3 y aún no se soluciona.
    • Xcode 8.2 aún no se soluciona lol. Oiii…
    • Debe ser fijo en Xcode 9 beta 3, de acuerdo a las notas de la versión.

  2. 15

    Adam Waite proporciona una buena solución. Yo sin embargo prefiero la siguiente solución, ya que hace hincapié en la solución y el extra de la propiedad también puede ser eliminado fácilmente una vez Xcode se fija.

    class CustomView: UIView {
        @IBOutlet
        public var delegate: CustomViewDelegate?
    
        ///Workaround for Xcode bug that prevents you from connecting the delegate in the storyboard.
        ///Remove this extra property once Xcode gets fixed.
        @IBOutlet
        public var ibDelegate: AnyObject? {
            get { return delegate }
            set { delegate = newValue as? CustomViewDelegate }
        }
    
        func someMethod() {
            //Here we always refer to `delegate`, not `ibDelegate`
            delegate?.onSomethingHappened()
        }
    }
    
    @objc protocol CustomViewDelegate {
        ...
    }

    Hola, es este error ya un año y medio de edad?

  3. 8

    Otro que no es bonita pero:

    @IBOutlet weak var ibDelegate: NSObject?
    @IBOutlet weak var ibDataSource: NSObject?
    var delegate: MultipleButtonViewDelegate? { return ibDelegate as? MultipleButtonViewDelegate }
    var dataSource: MultipleButtonViewDataSource? { return ibDataSource as? MultipleButtonViewDataSource }
    • Buena respuesta! Utilice este modo para evitar que el cambio de tipo normalmente la Toma de corriente.
  4. 3

    Este es un hilo viejo, pero he pensado que me gustaría señalar que, como de Xcode 9 beta 3, ahora es posible conectar un delegado personalizado escrito en swift para el interface builder.

    De acuerdo a las notas de la versión

    Interface Builder ahora reconoce puntos de venta, acciones, y inspectable
    las propiedades declaradas en las clases que tienen una rápida extensión del protocolo.
    (22201035)

    //Can connect this to interface builder now    
    class MyViewController: UIViewController {
        @IBOutlet weak var myDelegate: TheNewDelegate?
    }
  5. 1

    Para mí, la razón fue la vista de la tabla se nil en el punto en el que me trató de establecer el origen de datos y delegado. Esto era debido a la inicializador designado llamar initWithNibName:bundle: que no garantiza inicializa las conexiones. Aplazar mi delegado y el origen de datos de configuración para viewDidload trabajó como un encanto.

Dejar respuesta

Please enter your comment!
Please enter your name here