web-dev-qa-db-ja.com

タイプ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
    }
}
52
David

self.MessageTextField.delegate = selfは、selfdelegateとしてUITextFieldを割り当てようとするため、エラーが発生します。
しかし、あなたのViewControllerUITextFieldDelegateではありません。クラスをこのようなデリゲートにするには、 UITextFieldDelegate protocol を採用する必要があります。これは、クラスが継承/準拠するプロトコルおよびクラスのリストに追加することで実現できます。あなたの場合、それは行を変更することによって行われます

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate
88
luk2302

クラスがUITextFieldDelegateプロトコルに準拠していることを宣言し、必要なプロトコルメソッドを実装します。

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

私は同じ問題を抱えていましたが、それは別の問題のためでした:

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
}()

letsはインスタンス化中に発生する必要がありますが、lazy varsはインスタンス化後の時間に遅延する可能性があるため、self...にアクセスできます。

4
Honey

恥ずかしいことですが、言及する価値があります。適合を宣言するときは、正しいView Controllerの拡張であることを確認してください。たとえば、誤ってこれをしないでください。

class ViewController: UIViewController {

}

extension SimilarlyNamedViewController: UITableViewDelegate {

}

オートコンプリートを使用して簡単に取得できます。一見同じように見えるためです。

2
mylogon