Подтвердить что ты не робот

Невозможно присвоить значение типа 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
    }
}
4b9b3361

Ответ 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 {

}

Это легко сделать, если вы используете автозаполнение и получаете от вас, потому что, на первый взгляд, это выглядит одинаково.