无法将 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
分配为 UITextField
的 delegate
。
但是你的 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
以符合 UITableViewDelegate
、UITableViewDataSource
协议。
原因是如果您使用 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
}()
let
s 需要在实例化期间发生,但是 lazy var
s 可以延迟到实例化后的某个时间,因此它们可以访问 self
...
承认这一点很尴尬,但值得一提。确保在声明一致性时扩展正确的视图控制器。例如,不要无意中这样做。
class ViewController: UIViewController {
}
extension SimilarlyNamedViewController: UITableViewDelegate {
}
如果你使用自动完成功能,这很容易做到,因为一眼看去,它看起来是一样的。
这是我写行 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
分配为 UITextField
的 delegate
。
但是你的 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
以符合 UITableViewDelegate
、UITableViewDataSource
协议。
原因是如果您使用 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
}()
let
s 需要在实例化期间发生,但是 lazy var
s 可以延迟到实例化后的某个时间,因此它们可以访问 self
...
承认这一点很尴尬,但值得一提。确保在声明一致性时扩展正确的视图控制器。例如,不要无意中这样做。
class ViewController: UIViewController {
}
extension SimilarlyNamedViewController: UITableViewDelegate {
}
如果你使用自动完成功能,这很容易做到,因为一眼看去,它看起来是一样的。