行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
}
}
行self.MessageTextField.delegate = self
は、self
のdelegate
としてUITextField
を割り当てようとするため、エラーが発生します。
しかし、あなたのViewController
はUITextFieldDelegate
ではありません。クラスをこのようなデリゲートにするには、 UITextFieldDelegate
protocol を採用する必要があります。これは、クラスが継承/準拠するプロトコルおよびクラスのリストに追加することで実現できます。あなたの場合、それは行を変更することによって行われます
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
に
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate
クラスが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
プロトコルに準拠させました。
理由は、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
sはインスタンス化中に発生する必要がありますが、lazy var
sはインスタンス化後の時間に遅延する可能性があるため、self
...にアクセスできます。
恥ずかしいことですが、言及する価値があります。適合を宣言するときは、正しいView Controllerの拡張であることを確認してください。たとえば、誤ってこれをしないでください。
class ViewController: UIViewController {
}
extension SimilarlyNamedViewController: UITableViewDelegate {
}
オートコンプリートを使用して簡単に取得できます。一見同じように見えるためです。