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

时间:2015-04-13 12:35:41

标签: ios swift delegates syntax-error uitextfielddelegate

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

4 个答案:

答案 0 :(得分:85)

self.MessageTextField.delegate = self导致错误,因为您尝试将self指定为delegate的{​​{1}}。
但是您的UITextField 不是一个ViewController。要使您的班级成为这种代表,您需要采用UITextFieldDelegate protocol。这可以通过将其添加到您的类继承/符合的协议和类列表来实现。在您的情况下,通过更改行

来完成
UITextFieldDelegate

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

答案 1 :(得分:11)

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

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

答案 2 :(得分:4)

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

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协议。

原因是如果您使用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
}()
在实例化期间需要发生

let,但lazy var可以在实例化后延迟到一段时间,因此可以访问self ...

答案 3 :(得分:1)

尴尬地拥有它,但值得一提。声明一致性时,请确保您扩展了正确的视图控制器。例如,不要意外地这样做。

class ViewController: UIViewController {

}

extension SimilarlyNamedViewController: UITableViewDelegate {

}

如果您使用自动完成功能并得到您的帮助,这是一件容易的事,因为乍一看,它看起来是一样的。