Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

593
Vistas
'textFieldDidBeginEditing' casi coincide con el requisito opcional 'textFieldDidBeginEditing' del protocolo 'UITextFieldDelegate' en Swift

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'

ingrese la descripción de la imagen aquí

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.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Con "casi coincidencias", el compilador te dice dos cosas:

  1. No coincide : el método 'textFieldDidBeginEditing(_:)' no es lo mismo que el método delegado 'textFieldDidBeginEditing(_:)'. Esto en sí mismo no es un problema para el compilador, solo tiene un método con algún nombre y no conoce el nombre, por lo que está bien.
  2. Se parece mucho al método delegado 'textFieldDidBeginEditing(_:)'. Entonces, el compilador puede ver que probablemente pretendía que este fuera un método de delegado, y le está diciendo que, bueno, no funcionó. Lo que ha escrito no es un método de delegado.

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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) { } }
over 4 years ago · Santiago Trujillo Denunciar

0

Marque su método también como public

 public func textFieldDidBeginEditing(_ textField: UITextField)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda