web-dev-qa-db-fra.com

Impossible d'affecter une valeur de type ViewController à une valeur de type UITextFieldDelegate?

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
    }
}
52
David

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
88
luk2302

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 { ... }
11
keithbhunter

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
}()

lets doivent se produire pendant l'instanciation, mais lazy vars peuvent être différés après l’instanciation, ils peuvent donc accéder à self...

4
Honey

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.

2
mylogon