【问题标题】:How do I get the textfield value of a UIAlertController and use it in other functions? (Swift 3)如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 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()

【问题讨论】:

    标签: ios uitableview swift3 uitextfield uialertcontroller


    【解决方案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
    

    【讨论】:

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

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

        static var sharedInstance = DataController {
          private init()
    }
    

    存储在变量中:

    var value : Double = 0.0
    

    在 TableViewController 中,调用:

    Datacontroller.sharedInstance.value
    

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

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2016-10-21
      • 2017-03-24
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      相关资源
      最近更新 更多