Как добавить заполнитель в мой UITextField? (Используя Xcode 12)

avatar
loverofcoding
8 августа 2021 в 17:14
62
1
0

EDIT: новая ошибкаВ настоящее время используется XCode 12, и я пытаюсь добавить заполнитель. Я следил за документацией Swift QuestionBot, но она не работает (я предполагаю, что это потому, что мой XCode намного новее). В любом случае, спасибо за помощь!

EDIT: я добавил изображение новой ошибки, которую я получил.

РЕДАКТИРОВАТЬ 2: Добавлена ​​структура MyQuestionAnswerer()! Он находится на другом контроллере представления (очевидно).

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var responseLabel: UILabel!
    @IBOutlet weak var askButton: UIButton!
    @IBOutlet weak var questionField: UITextField!
    
    let questionAnswerer = MyQuestionAnswerer()

    override func viewDidLoad() {
        super.viewDidLoad()
        questionField.becomeFirstResponder()
    }

    func respondToQuestion(_ question: String) {
        let answer = questionAnswerer.responseTo(question: question)

        displayAnswerTextOnScreen(answer)
        questionField.placeholder = "Ask another question..."
        questionField.text = nil
        askButton.isEnabled = false
    }

    @IBAction func askButtonTapped(_ sender: AnyObject) {
        guard questionField.text != nil else {
            return
        }
        questionField.resignFirstResponder()
    }
    
    func displayAnswerTextOnScreen(_ answer: String) {
        responseLabel.text = answer
    }

}

extension ViewController: UITextFieldDelegate {

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return false
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        guard let text = textField.text else {
            return
        }
        
        respondToQuestion(text)
    }
    
    @IBAction func editingChanged(_ textField: UITextField) {
        guard let text = textField.text else {
            askButton.isEnabled = false
            return
        }
        
        askButton.isEnabled = !text.isEmpty
    }
}

struct MyQuestionAnswerer {
    
    func responseTo(question: String) -> String {
        let loweredQuestion = question.lowercased()
        
        if loweredQuestion == "What is the current vaccination rate of the Philippines?" {
            return "As of August 8, the vaccination rate of the Philippines is 10%!"
        } else if loweredQuestion.hasPrefix("Where") {
            return "Check the map for nearby vaccination centers."
    }
}
Источник
Demented07
8 августа 2021 в 17:25
1

Нажмите «Изменить», чтобы изменить свой вопрос, затем вы можете прикрепить код, используя кнопку, которая выглядит как «{}». Это поможет нам попытаться решить вашу проблему. Пожалуйста, приложите весь код, относящийся к проблеме (код для UITextField).

loverofcoding
8 августа 2021 в 17:32
0

@ Demented07 Только что!

Ответы (1)

avatar
Demented07
8 августа 2021 в 17:45
1

Заполнитель отсутствует, когда textFiled не установлен, пока не будет вызван метод respondToQuestion. Вероятно, его следует установить внутри метода жизненного цикла контроллера представления, такого как viewDidLoad().

.

Пример:

override func viewDidLoad() {
        super.viewDidLoad()
        questionField.placeholder = "Ask another question"
        questionField.becomeFirstResponder()
    }
loverofcoding
8 августа 2021 в 18:04
0

Благодарю вас! Однако, попробовав это, я получил еще одну ошибку. Мне очень жаль, но вы не могли бы помочь мне с этим?

Demented07
8 августа 2021 в 18:05
0

сейчас посмотрю

Demented07
8 августа 2021 в 18:25
0

Можете ли вы предоставить код для вашего класса MyQuestionAnswerer(), пожалуйста.

loverofcoding
8 августа 2021 в 18:41
0

Просто сделал! Спасибо.

Demented07
8 августа 2021 в 18:52
0

@loverofcoding Я получил одну ошибку, когда скопировал ваш код для проверки. Вы забыли убедиться, что есть строка, которая возвращается, если оба оператора if и else if терпят неудачу. Чтобы исправить это, я добавил это в нижнюю часть блока if: else { return loweredQuestion } Я не уверен, что вы хотите получить, если эти два условия не выполняются (я оставлю это на ваше усмотрение). не работает, пожалуйста, прокомментируйте.

Demented07
8 августа 2021 в 18:59
0

(Я говорю о блоке if внизу внутри вашей структуры MyQuestionAnswerer).

loverofcoding
8 августа 2021 в 19:01
0

Привет! Я добавил "else { return "?" }" в конце. Спасибо, что заметили! Быстрый вопрос - вы скопировали весь мой код, верно? Удалось заставить бота работать? Например, вы отправляете вопрос в текстовое поле, нажимаете кнопку, и верхняя метка меняется на то, что вы задали? Это то, чего я пытаюсь достичь.

loverofcoding
8 августа 2021 в 19:02
0

Я скопировал код Swift QuestionBot и чувствую, что он устарел. Не уверен, что я должен изменить - текстовое поле и кнопка, похоже, работают, но метка не сдвигается с места! Он не кажется интерактивным.

Demented07
8 августа 2021 в 19:02
0

Извините, что вы имеете в виду, когда говорите «бот»?

loverofcoding
8 августа 2021 в 19:03
0

О, так оно и называется - QuestionBot. В основном потому, что вы задаете/вводите вопросы в текстовое поле, и оно закодировано таким образом, что вы получаете автоматический ответ. Они просто называют это ботом, но он сделан с использованием чистого Swift на XCode.

Demented07
8 августа 2021 в 19:24
0

Для этого вам просто нужно изменить label.text на то, что вы хотите, чтобы вывод был при нажатии на кнопку askQuestionButton.

Demented07
8 августа 2021 в 19:41
0

Когда я говорю вывод, я имею в виду текст, который отображается на/в этикетке.