Estoy trabajando en una aplicación en la que he creado módulos para cada característica de la aplicación. Tengo que cambiar de un controlador de interfaz de usuario de módulo a otro controlador de interfaz de usuario de módulo.
Tengo UIController en un módulo y marco ese controlador como identificador de acceso público como se muestra a continuación
public class InterAccountTransferViewController: UIViewController { override public func viewDidLoad() { ...... ...... } }La clase anterior también implementa delegados de UITextField en extensión. Cuando creé la clase anterior como acceso abierto, recibo una advertencia sobre los delegados de TextField como se muestra a continuación
El método de instancia 'textFieldDidBeginEditing' casi coincide con el requisito opcional 'textFieldDidBeginEditing' del protocolo 'UITextFieldDelegate'
Ahora no se llama a los delegados de campo de texto. Cuando traté de desactivar una advertencia haciendo que los delegados fueran privados, todavía no se les llama.
Por favor, hágame saber cómo silenciar estas advertencias y llamar también a los delegados.
Cualquier idea o sugerencia sería genial. Estoy trabajando en Xcode 10 con Swift 4.2. Por favor, hágamelo saber si tengo que explicar más mi pregunta.
Con "casi coincidencias", el compilador te dice dos cosas:
Es bueno que el compilador te diga que hay un problema. No es tan agradable que no explique cuál es exactamente el problema.
El problema es que tu clase tiene más visibilidad que el método de delegado. Su clase es public , mientras que su método de delegado es solo internal (porque internal es el valor predeterminado, si no tiene un especificador de acceso en su declaración).
La solución es darle al método de delegado un especificador de acceso public también.
Tienes que cambiar
func textFieldDidBeginEditing(_ textField: UITextField) { // ... }para
public func textFieldDidBeginEditing(_ textField: UITextField) { // ... }Esto le permitirá al compilador saber que el método está destinado a ser un método de delegado.
Contenido extra...
¿Cómo encontré la solución? Reproduje el problema en Xcode. Hice clic en la advertencia y leí la corrección: "Hacer que 'textFieldDidBeginEditing' no sea público para silenciar esta advertencia". Hice clic en "Reparar" y la línea se cambió a "función privada textFieldDidBeginEditing (_ textField: UITextField)". Así que pensé que tal vez hacerlo public en lugar de private ayudaría aún más. Lo probé, lo comprobé y funcionó.
¿Por qué Swift incluso hace esto? No estoy seguro, pero mi conjetura es esta: si una clase es pública, pero el método de protocolo es interno, significaría que un objeto de controlador de vista individual implementa el protocolo cuando se mira desde la perspectiva del módulo. Pero dado que la implementación del protocolo es interna, el método del protocolo no estaría disponible cuando se mira desde la perspectiva de módulos externos, por ejemplo, desde UIKit. Pero esto no es posible en el tiempo de ejecución de Objective C, e incluso si fuera posible, sería malo. Silenciosamente, sería posible hacer que los métodos de protocolo sean públicos o semipúblicos, pero no muy limpios: por ejemplo, uno podría hacer que textFieldDidBeginEditing sea interno, pero cuando convierte el objeto en un pseudo-objeto UITextFieldDelegate, puede llamar repentinamente a ese método, que también sería sorprendente.
Prueba esto
class InterAccountTransferViewController: UIViewController,UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() //Attach delegates self.textfield.delegate = self } //TextField Delegate Method public func textFieldDidBeginEditing(_ textField: UITextField) { } }Marque su método también como public
public func textFieldDidBeginEditing(_ textField: UITextField)