无法将ViewController类型的值赋给UITextFieldDelegate类型的值?

Dav*_*vid 53 delegates syntax-error ios uitextfielddelegate swift

这是我写这行时的错误self.MessageTextField.delegate = self:

/ChatApp/ViewController.swift:27:42:无法将类型'ViewController'的值赋给'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
    }
}
Run Code Online (Sandbox Code Playgroud)

luk*_*302 88

该行self.MessageTextField.delegate = self导致错误,因为您尝试指定selfdelegatea UITextField.
但是,你ViewController 是不是一个UITextFieldDelegate.要使您的类成为这种委托,您需要采用该UITextFieldDelegate协议.这可以通过将其添加到您的类继承/符合的协议和类列表来实现.在你的情况下,通过改变线来完成

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
Run Code Online (Sandbox Code Playgroud)

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate
Run Code Online (Sandbox Code Playgroud)

  • @ luk2302我在上面看了你的评论,它仍然没有点击你的意思.我终于弄明白了.UITextViewDelegate与UITextFieldDelegate.不一样. (4认同)
  • 我有同样的错误。现在添加了 UITextViewDelegate 并且错误不会消失......有人有解决方案吗? (2认同)
  • @hannes UITextViewDelegate是另一回事。区别是* Field *与* View *! (2认同)

kei*_*ter 11

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

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { ... }
Run Code Online (Sandbox Code Playgroud)


Hon*_*ney 5

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

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 
}
Run Code Online (Sandbox Code Playgroud)

我并致以CustomViewController以符合UITableViewDelegateUITableViewDataSource协议。

原因是self使用时无法访问let。我不得不说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
}()
Run Code Online (Sandbox Code Playgroud)

lets必须在实例化期间发生,但是lazy vars可以延迟到实例化之后的某个时间,因此它们可以访问self...