medium delegate create ios swift delegates syntax-error uitextfielddelegate

ios - create - swift 4 delegate



¿No se puede asignar un valor de tipo ViewController a un valor de tipo UITextFieldDelegate? (4)

Declare que su clase se ajusta al protocolo UITextFieldDelegate e implemente cualquiera de los métodos de protocolo que necesite.

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { ... }

Aquí está el error cuando escribí la línea self.MessageTextField.delegate = self :

/ChatApp/ViewController.swift:27:42: ¿No se puede asignar un valor de tipo ''ViewController'' a un valor de tipo ''UITextFieldDelegate?''

Aquí está mi código Swift (ViewerController.swift):

// // ViewController.swift // ChatApp // // Created by David Chen on 15/4/12. // Copyright (c) 2015年 cwsoft. All rights reserved. // import UIKit import Parse class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var messagesArray:[String] = [String]() @IBOutlet weak var MessageTableView: UITableView! @IBOutlet weak var ButtonSend: UIButton! @IBOutlet weak var DockViewHeightConstraint: NSLayoutConstraint! @IBOutlet weak var MessageTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() // self.MessageTableView.delegate = self self.MessageTableView.dataSource = self //Set delegate self.MessageTextField.delegate = self self.messagesArray.append("Test 1") self.messagesArray.append("Test 2") self.messagesArray.append("Test 3") } @IBAction func ButtonSendPressed(sender: UIButton) { self.view.layoutIfNeeded() UIView.animateWithDuration(0.5, animations: { self.DockViewHeightConstraint.constant = 400 self.view.layoutIfNeeded() }, completion: nil) } //MARK : TextField Delegage Methods //MARK : Table View Delegate Methods func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = self.MessageTableView.dequeueReusableCellWithIdentifier("MessageCell") as! UITableViewCell cell.textLabel?.text = self.messagesArray[indexPath.row] return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return messagesArray.count } }


Es embarazoso reconocerlo, pero vale la pena mencionarlo. Asegúrese de extender el controlador de vista correcto al declarar conformidad. Por ejemplo, no hagas esto por accidente.

class ViewController: UIViewController { } extension SimilarlyNamedViewController: UITableViewDelegate { }

Es fácil de hacer si usa el autocompletado y lo supera porque, de un vistazo, se ve igual.


La línea self.MessageTextField.delegate = self causa el error ya que intenta asignarse self como delegate de un UITextField .
Pero su ViewController no es un UITextFieldDelegate . Para que su clase tenga este tipo de delegación, debe adoptar el protocolo UITextFieldDelegate . Esto se puede lograr agregándolo a la lista de protocolos y clases de los que su clase hereda / cumple. En su caso, eso se hace cambiando la línea

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

a

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate


Tuve el mismo problema, pero fue por un problema diferente:

class CustomViewController: UIViewController { let customerCardTableView: UITableView = { let table = UITableView() table.translatesAutoresizingMaskIntoConstraints = false table.backgroundColor = UIColor(patternImage: UIImage(named: "background")!) table.delegate = self table.dataSource = self table.separatorStyle = .none table.separatorColor = UIColor(rgb:0xFFFFFF) table.separatorInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) return table }() ...other code }

y CustomViewController mi CustomViewController para cumplir con los protocolos UITableViewDelegate , UITableViewDataSource .

La razón es que self no es accesible si está usando let . Tuve que lazy var customerCardTableView: UITableView es decir:

lazy var customerCardTableView: UITableView = { let table = UITableView() table.translatesAutoresizingMaskIntoConstraints = false table.backgroundColor = UIColor(patternImage: UIImage(named: "background")!) table.delegate = self table.dataSource = self table.separatorStyle = .none table.separatorColor = UIColor(rgb:0xFFFFFF) table.separatorInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) return table }()

se requiere que sucedan durante la creación de instancias, pero las lazy var se pueden retrasar un tiempo después de la creación de instancias, por lo tanto, pueden acceder a self ...