Voici l'erreur quand j'ai écrit la ligne self.MessageTextField.delegate = self
:
/ChatApp/ViewController.Swift:27:42: Impossible d'affecter une valeur de type 'ViewController' à une valeur de type 'UITextFieldDelegate?'
Voici mon 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
}
}
La ligne self.MessageTextField.delegate = self
cause l'erreur en essayant d'affecter self
en tant que delegate
d'un UITextField
.
Mais votre ViewController
n'est pas un UITextFieldDelegate
. Pour faire de votre classe ce type de délégué, vous devez adopter le protocole UITextFieldDelegate
. Cela peut être réalisé en l'ajoutant à la liste des protocoles et des classes dont votre classe hérite/conforme. Dans votre cas, cela se fait en changeant la ligne
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
à
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate
Déclarez que votre classe est conforme au protocole UITextFieldDelegate
et implémentez l’une des méthodes de protocole dont vous avez besoin.
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { ... }
J'ai eu le même problème, mais c'était à cause d'un problème différent:
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
}
et j'ai étendu mon CustomViewController
pour qu'il soit conforme aux protocoles UITableViewDelegate
, UITableViewDataSource
.
La raison en était que self
n'est pas accessible si vous utilisez let
. J'ai dû lazy var customerCardTableView: UITableView
c'est à dire.:
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
}()
let
s doivent se produire pendant l'instanciation, mais lazy var
s peuvent être différés après l’instanciation, ils peuvent donc accéder à self
...
Embarrassant de l'avouer, mais mérite une mention. Assurez-vous que vous êtes étendre le contrôleur de vue approprié lors de la déclaration de conformité. Par exemple, ne le faites pas par accident.
class ViewController: UIViewController {
}
extension SimilarlyNamedViewController: UITableViewDelegate {
}
C'est facile à faire si vous utilisez la saisie semi-automatique et que vous réussissez, car en un coup d'œil, ça a l'air pareil.