在 UIView 和 UIViewController 之间传递数据

Posted

技术标签:

【中文标题】在 UIView 和 UIViewController 之间传递数据【英文标题】:Passing data between UIView and 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? 【参考方案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().

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

【讨论】:

以上是关于在 UIView 和 UIViewController 之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

UIView无法改变尺寸大小怎么办?总是XIB建立的代码。

子视图与子视图控制器 z 位置

如何将 IBOutlet 标记为可用于特定 iOS 版本

如何使用自动布局将 UIView 定位在其他两个 UIView 的中心?

UIView 和 ScrollView 之间的 UIView 过渡翻转

iOS学习笔记— UIView 渲染和内容管理