如何获取UIAlertController的textfield值并在其他函数中使用它? (斯威夫特3)

时间:2017-04-17 07:10:04

标签: ios uitableview swift3 uitextfield uialertcontroller

基本上,我想要UIViewController的textfield的值,然后用它来做一个if-else语句。

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

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

@Test
public void testFluxOrMono() {
  Flux<String> source = Flux.just(2, 3);
  List<Integer> result = source
        .flatMap(i -> multiplyBy2Async(i))
        .collectList()
        .block();
  // run your asserts on the list. Reminder: the order may not be what you expect because of the `flatMap`
  // Or with a Mono:
  Integer resultOfMono = Mono.just(5)
        .flatMap(i -> multiplyBy2Async(i))
        .map(i -> i * 4)
        .block();
  // run your asserts on the integer
}

这是我的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)
}

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

即。

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

然后在alertBox()函数中:

var textOfTF : Double = 0.0

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

            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())
            */

        }

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

var userInput : Double = 0.0
func getUserInput() -> Double{
    return userInput
}
func setUserInput(userI: Double){
    userInput = userI
    return
}

但是在那个方法之外打印只是打印了 0.0 值。

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

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

在TableViewController类中:

    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())


    }
}))

在DataController类中:

var dc = DataController.sharedInstance

2 个答案:

答案 0 :(得分:0)

您可以轻松地为用户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

答案 1 :(得分:0)

我设法解决了这个问题。是的,我一直将它保存到DataController但没有单例方法。因此,使用单例方法来保存和检索数据。

    static var sharedInstance = DataController {
      private init()
}

存储在变量中:

var value : Double = 0.0

在TableViewController中,调用:

Datacontroller.sharedInstance.value

感谢kkakkurt帮助我,但这很简单。我不知道我是如何忽视它的。