【问题标题】:Passing data between UIView and UIViewController在 UIView 和 UIViewController 之间传递数据
【发布时间】:2020-01-20 02:02:29
【问题描述】:

如果这已经有答案但我无法找到我正在寻找的答案,请提前道歉。

我一直坚持将数据从 UIView 传递到 UIViewController 的最佳方法。假设我有这个表单数据,其中包含用户填写的信息。数据通过各个 UITextField 存在于视图中。我应该如何将这些信息传递给控制器​​以执行验证并使用这些数据创建发布请求?

通过闭包来做到这一点有意义吗?像下面这样:

@objc func submitFormData() {
    // call function passed via the view controller
}

在视图和控制器之间传递数据的最佳做法是什么?供您参考,我没有使用 StoryBoard,而是以编程方式创建所有内容。

我们将不胜感激,谢谢!

【问题讨论】:

  • 首先 - 请给我们看一些代码。 IE。你试过什么。您是仅使用 Apple 的 API 还是使用 3rd 方 API。其次,将数据从视图返回到控制器在许多教程和帖子中都有详细记录。委托是 Apple API 中最常用的方法。
  • @drekka 感谢您的回复,这是一个关于最佳实践的问题。你能指出我提到的一些教程吗?我试图在不使用故事板的情况下做到这一点。
  • 我没有任何具体的教程。我建议只是谷歌搜索一些。就故事板而言。如果您正在学习编写 iOS 应用程序,我建议您从它们开始。它们将为您节省大量时间和代码。手工编写 UI 是一件耗时/代码消耗的事情,需要深入了解它们的工作原理。袖手旁观很好,但大多数情况下不需要,所以开始时,我建议使用故事板,直到你能舒服地编写应用程序。然后,您将更好地了解何时以及是否需要手动编写代码。
  • 这能回答你的问题吗? Delegates in swift?

标签: ios swift uiview uiviewcontroller


【解决方案1】:

首先,为您的数据创建一个结构/模型并进行必要的验证。

class UserDataSpecifier {

    var fields = [UserField]()

    struct UserField {
        var title: String?
        var placeHolder: String = ""
        var inputTxt: String = ""
        var image: String = ""

        init(titleStr: String, inputStr: String? = "", img: String = "") {
            title = titleStr
            placeHolder = titleStr
            inputTxt = inputStr ?? ""
            image = img
        }
    }

    init() {
        prepareForSignup()
    }

    func prepareForSignup() {
        fields.append(UserField(titleStr: "First Name")
            fields.append(UserField(titleStr: "Email"))
            fields.append(UserField(titleStr: "Password"))
    }

func isValidData(type: FormType) -> (isValid: Bool, error: String) {
     if fields[0].inputTxt.isEmpty {
       return (false, "Enter your message")
     } else if fields[1].inputTxt.isEmpty {
       return (false, "Enter your email")
     }
   return (true, "")
}

}

在您的 ViewController 类中创建一个数据实例。填充该对象的值,然后对其进行验证。

   var userData: UserDataSpecifier = UserDataSpecifier()


   userData.fields[0].inputTxt = "name"
   userData.fields[1].inputTxt = "email@gmail.com

     let result = userData.isValidData()
        if result.isValid {
           print("Valid data")
        } else {
           print(result.error)
        }

您还可以将此 userData 实例传递给您的视图并从您的视图中填充数据。填充数据后在 ViewController 中验证它。

【讨论】:

    【解决方案2】:

    在我看来,将数据从View 传递到ViewController 的最佳方式是通过DelegatesProtocols

    • 使用submitFormData() 函数在ViewController 中创建协议。
    • 在视图中声明一个委托变量
    • ViewController设置为View'sdelegate
    • 然后在“submitFormData”函数中调用delegate.submitFormData().

    还有其他的数据传递方式,这只是我个人的喜好。希望这有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2016-01-22
      • 2017-12-09
      • 2020-10-23
      相关资源
      最近更新 更多