Пусть функция ждет ответа - Swift

Я пытаюсь запрограммировать текстовое приключение. У меня есть NSTextView, в котором пользователь может писать команды и получать ответ, но я не могу найти способ "приостановить" функцию, чтобы дождаться ответа пользователя.

import Cocoa

@IBOutlet var textView: NSTextView!

var playerName:String = ""
var enteredString:String = ""

//Keyboard Input

private func returnChar(theEvent: NSEvent) -> Character?{
    let s: String = theEvent.characters!
    for char in s{
        return char
    }
    return nil
}

override func keyUp (theEvent: NSEvent) {
    let s: String = String(self.returnChar(theEvent)!)
    enteredString.extend(s)

    if theEvent.keyCode == 36 {

        //Here I'd like to 
        //say that start() 
        //should continue

    }
}

//Story

func start() {
    textView.string?.extend("Hi, what's your name?\n")

    //Here I'd like to 
    //wait for the
    //users response

    playerName = enteredString
    textView.string?.extend("Are you sure that I should call you \(playerName)")

}

Спасибо за ваш ответ:D

3 ответа

Решение

Если вы используете Swift 2, вы можете использовать readLine(), которая ждет, пока пользователь не нажмет ввод в командной строке. И это возвращает String? потому что пользователь может нажать Enter, не набрав ничего.

Я полагаю, что ожидание ввода в NSTextView не очень хорошая стратегия

Что если у вас есть метод, который знает, в каком состоянии находится ваше приложение? Затем всякий раз, когда вы получаете текст, который хотите использовать, отправьте его этому методу и дайте ему решать, основываясь на состоянии, как его использовать (имя, команда...). Тем временем ваше приложение только что вернулось в цикл выполнения, позволяя пользователю делать то, что он хочет.

Добавьте делегат UITextField и UITextField для пользовательского ввода. Установите для делегата UITextField значение self и добавьте метод: 'textFieldShouldReturn'.

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

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    var userInputTextField: UITextField?

    override func viewDidLoad() {
        super.viewDidLoad()

        userInputTextField = UITextField(frame: CGRectMake(0, 100, view.frame.width, 100))
        userInputTextField?.delegate = self
        userInputTextField?.returnKeyType = UIReturnKeyType.Done
        view.addSubview(userInputTextField!)
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        println(textField.text)
        return true
    }
}
Другие вопросы по тегам