如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 3)

Posted

技术标签:

【中文标题】如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 3)【英文标题】:How do I get the textfield value of a UIAlertController and use it in other functions? (Swift 3) 【发布时间】:2017-04-17 07:10:04 【问题描述】:

基本上,我想要 UIViewController 的文本字段的值,然后用它来执行 if-else 语句。

我将遍历字典,如果(字典的)值大于和/或等于用户输入,我将通过 tableview 显示键。

我做了一个在加载应用程序时显示的警告框。我创建了一个函数,然后在 viewDidLoad() 函数下调用它。可以在这里看到:

 func alertBox()

    // create String objects for the title and the message
    let title = "Enter your GPA"
    let message = "With your help, we can list courses you are most likely eligible for based on the GPA you provide to us."

    // create a UIAlertController object
    let alert = UIAlertController(title: title,
                                  message: message,
                                  preferredStyle: UIAlertControllerStyle.alert)


    // create a UIAlertAction object

    //2. Add the text field. You can configure it however you need.
    alert.addTextField  (textField) in
        textField.text = ""
    

    // 3. Grab the value from the text field, and print it when the user clicks OK.
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler:  [weak alert] (_) in
        let textField = alert?.textFields![0] // Force unwrapping because we know it exists.
        if let textAlert = textField?.text 
            print("Text field: \(textAlert)")
            let item = Double(textAlert)
            print(item!)
            let unwrappedvalue = item!
            self.dc.setUserInput(userI: unwrappedvalue)
            print(self.dc.getUserInput())


        
    ))


    // add the UIAlertAction object to the UIAlertController object
    let cancelAction = UIAlertAction(title: "Cancel",
                                     style: .cancel,
                                     handler: nil)
    alert.addAction(cancelAction)

    // display the UIAlertController object
    present(alert, animated: true, completion: nil)

这是我的 viewDidLoad() 函数:

    override func viewDidLoad() 
    super.viewDidLoad()
    alertBox()     

如您所见,我实际上在 DataController 类中做了一个 get/set 方法。这样我可以设置值,然后在以后的方法中获取值。我用过它,但它似乎根本没有保存我的价值观。我还尝试创建一个全局变量,然后将文本字段的值存储到该变量中。

var textOfTF : Double = 0.0

然后在 alertBox() 函数中:

            if let textAlert = textField?.text 
            print("Text field: \(textAlert)")
            let item = Double(textAlert)
            print(item!)
            self.textOfTF = item!
            /*
            self.dc.setUserInput(userI: unwrappedvalue)
            print(self.dc.getUserInput())
            */

        

这是我的 DataController 类中的 get/set 函数:

var userInput : Double = 0.0
func getUserInput() -> Double
    return userInput

func setUserInput(userI: Double)
    userInput = userI
    return

当我执行 alert.addAction 方法时它设法保存了(就是这个):

    alert.addAction(UIAlertAction(title: "OK", style: .default, handler:  [weak alert] (_) in
    let textField = alert?.textFields![0] // Force unwrapping because we know it exists.
    if let textAlert = textField?.text 
        print("Text field: \(textAlert)")
        let item = Double(textAlert)
        print(item!)
        let unwrappedvalue = item!
        self.dc.setUserInput(userI: unwrappedvalue)
        print(self.dc.getUserInput())


    
))

但是在该方法之外打印只是向我打印了一个 0.0 值。

我的代码有什么问题吗?请指教。

附: self.dc.setUserInput(..) 中的 dc 是我声明 DataController 类的变量。

在 TableViewController 类中:

var dc = DataController.sharedInstance

在 DataController 类中:

static var sharedInstance = DataController()

【问题讨论】:

【参考方案1】:

您可以像这样轻松地为用户 GPA 值定义静态全局值:

struct defaultsKeys 
        static var userGPA:Double = 0.0
    

之后,您可以在警报框中的 textField 值中设置此值:

alert.addAction(UIAlertAction(title: "OK", style: .default, handler:  [weak alert] (_) in
    let textField = alert?.textFields![0] // Force unwrapping because we know it exists.
    if let textAlert = textField?.text 
        print("Text field: \(textAlert)")
        defaultsKeys.userGPA = Double(textAlert)!
    

您可以在每个视图控制器中使用此 userGPA 值并调用:

defaultsKeys.userGPA

【讨论】:

对其进行了测试,它给了我相同的结果,但仍然无法存储。 也许您可以在此示例中大致了解静态全局变量的使用情况:***.com/a/43466290/3401842【参考方案2】:

我已经设法解决了。是的,我一直将它保存到 DataController 但没有单例方法。所以使用单例方法来保存和检索数据。

    static var sharedInstance = DataController 
      private init()

存储在变量中:

var value : Double = 0.0

在 TableViewController 中,调用:

Datacontroller.sharedInstance.value

感谢 kkakkurt 帮助我,但这真的很简单。我不知道我怎么忽略了它。

【讨论】:

以上是关于如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 3)的主要内容,如果未能解决你的问题,请参考以下文章

iOS UI 测试:如何获取 UIAlertController 的消息

注册通知时如何从存在的 UIAlertcontroller 获取 UIAlertAction

如何在Objective C中通过UIView获取UIAlertController?

在 UIAlertController 下获取最顶层的视图控制器

如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 3)

Swift 之自定义 UIAlertController