Пусть функция ждет ответа - 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
}
}