Как получить ввод текста из UIAlertcontroller ИЛИ как дождаться ввода с помощью Swift

Я пытаюсь представить Alertcontroller, который запрашивает у пользователя имя файла, а затем использует имя файла в другом месте программы. Я пробовал множество вариантов следующего кода:

import UIKit

class ViewController: UIViewController {

var shortName: String!

@IBAction func saveFile(sender: AnyObject) {

       //request filename with alert

    var alertController:UIAlertController?
    alertController = UIAlertController(title: "Enter File",
        message: "Enter file name below",
        preferredStyle: .Alert)

    alertController!.addTextFieldWithConfigurationHandler(
        {(textField: UITextField!) in
            textField.placeholder = ""
    })

    let action = UIAlertAction(title: "Submit",
        style: UIAlertActionStyle.Default,
        handler: {[weak self]
            (paramAction:UIAlertAction!) in
            if let textFields = alertController?.textFields{
                let theTextFields = textFields as [UITextField]
                let enteredText = theTextFields[0].text
                self!.shortName = enteredText      //trying to get text into shortName
                print(self!.shortName)             // prints
            }
        })

    alertController?.addAction(action)
    self.presentViewController(alertController!,
        animated: true,
        completion: nil)

 //do some stuff with the input

    print(shortName)  //THIS RETURNS nil if uncommented. comment out to avoid crash

}


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

Я тщательно исследовал это и не могу найти, как:

  1. получить строковое значение shortName из замыкания UIAlertAction и в короткое имя (я знаю, что текущий «self!.shortName» недоступен вне замыкания — не имеет значения, какое имя я использую — не могу его получить)

  2. Если вы запустите программу «как есть», строка print(shortName) вызовет сбой из-за разворачивания nil. Как я могу получить предупреждение «ждать» ввода?

Большинство опубликованных «решений» имеют одну и ту же проблему — они на самом деле не получают текстовый ввод из замыкания в переменную, к которой может получить доступ остальная часть программы.

Благодарность


person Jeff E    schedule 28.01.2016    source источник


Ответы (2)


Конечно, вы получаете сбой, shortName равен нулю, пока кнопка «Отправить» не нажата. Вы можете попробовать что-то вроде этого:

@IBAction func saveFile(sender: AnyObject) {

var alertController:UIAlertController?
alertController = UIAlertController(title: "Enter File",
    message: "Enter file name below",
    preferredStyle: .Alert)

alertController!.addTextFieldWithConfigurationHandler(
    {(textField: UITextField!) in
        textField.placeholder = ""
})

let action = UIAlertAction(title: "Submit",
    style: UIAlertActionStyle.Default,
    handler: {[weak self]
        (paramAction:UIAlertAction!) in
        if let textFields = alertController?.textFields{
            let theTextFields = textFields as [UITextField]
            let enteredText = theTextFields[0].text
            self!.shortName = enteredText      //trying to get text into shortName
            print(self!.shortName)             // prints

            self?.handleText()

            NSOperationQueue.mainQueue().addOperationWithBlock({
                self?.handleTextInMainThread()
            })
        }
    })

    alertController?.addAction(action)
    self.presentViewController(alertController!,
        animated: true,
        completion: nil)
}

func handleText() {
    print(self.shortName)
}

func handleTextInMainThread() {
    print(self.shortName)
}

Вы должны использовать NSOperationQueue, если хотите работать с пользовательским интерфейсом внутри handleTextInMainThread после ввода пользователя.

person Leo    schedule 28.01.2016
comment
Лев, спасибо за быстрый ответ. Работал отлично. Я знал, что дело в нитках, но... - person Jeff E; 29.01.2016

Я думаю, что это время. Вы попытались напечатать shortName сразу после представления предупреждения. В то время значение еще не установлено.

Вы можете либо использовать семафор, чтобы дождаться его установки, либо делать все, что хотите, в закрытии действия для «отправить».

person Joe Smith    schedule 28.01.2016