在 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
的最佳方式是通过Delegates
和Protocols
。
submitFormData()
函数在ViewController
中创建协议。
在视图中声明一个委托变量
将ViewController
设置为View's
delegate
然后在“submitFormData
”函数中调用delegate.submitFormData().
还有其他的数据传递方式,这只是我个人的喜好。希望这有帮助!
【讨论】:
以上是关于在 UIView 和 UIViewController 之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自动布局将 UIView 定位在其他两个 UIView 的中心?