无法将 ViewController 类型的值分配给 UITextFieldDelegate 类型的值?

Cannot assign a value of type ViewController to a value of type UITextFieldDelegate?

这是我写行 self.MessageTextField.delegate = self:

时的错误

/ChatApp/ViewController.swift:27:42: Cannot assign a value of type 'ViewController' to a value of type 'UITextFieldDelegate?'

这是我的 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
    }
}

self.MessageTextField.delegate = self 导致错误,因为您尝试将 self 分配为 UITextFielddelegate
但是你的 ViewController 不是 一个 UITextFieldDelegate。要使您的 class 成为这种代表,您需要采用 UITextFieldDelegate protocol。这可以通过将其添加到协议列表中来实现,并且 class 是您的 class 继承自/符合。在您的情况下,这是通过更改行

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate

声明您的 class 符合 UITextFieldDelegate 协议并实现您需要的任何协议方法。

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

我遇到了同样的问题,但这是因为另一个问题:

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 
}

我确实扩展了我的 CustomViewController 以符合 UITableViewDelegateUITableViewDataSource 协议。

原因是如果您使用 let,则无法访问 self。我必须 lazy var customerCardTableView: UITableView 即:

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 需要在实例化期间发生,但是 lazy vars 可以延迟到实例化后的某个时间,因此它们可以访问 self...

承认这一点很尴尬,但值得一提。确保在声明一致性时扩展正确的视图控制器。例如,不要无意中这样做。

class ViewController: UIViewController {

}

extension SimilarlyNamedViewController: UITableViewDelegate {

}

如果你使用自动完成功能,这很容易做到,因为一眼看去,它看起来是一样的。