Невозможно присвоить значение типа ViewController значениям типа 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
}
}
Ответы
Ответ 1
Строка self.MessageTextField.delegate = self
вызывает ошибку, поскольку вы пытаетесь назначить self
как delegate
для UITextField
.
Но ваш ViewController
не a UITextFieldDelegate
. Чтобы сделать ваш класс такого рода делегатом, вам необходимо принять UITextFieldDelegate
protocol. Это может быть достигнуто путем добавления его в список протоколов и классов, которые ваш класс наследует от/соответствует. В вашем случае это делается путем изменения строки
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
к
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate
Ответ 2
Объявите, что ваш класс соответствует протоколу UITextFieldDelegate
и реализует любой из тех методов протокола, которые вам нужны.
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { ... }
Ответ 3
У меня была та же проблема, но это было из-за другой проблемы:
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
.
Причина заключалась в том, что self
недоступен, если вы используете let
. Я должен был lazy var customerCardTableView: UITableView
i.e.:
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
...
Ответ 4
просто напишите поле uitext в классе viewcontroller.... готово
Ответ 5
Неловко владеть этим, но стоит упомянуть. Убедитесь, что вы расширяете правильный контроллер представления при объявлении соответствия. Например, не делайте это случайно.
class ViewController: UIViewController {
}
extension SimilarlyNamedViewController: UITableViewDelegate {
}
Это легко сделать, если вы используете автозаполнение и получаете от вас, потому что, на первый взгляд, это выглядит одинаково.