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
...