gpt4 book ai didi

ios - Swift,如何在遵循 MVC 的同时声明需要实例成员的方法

转载 作者:行者123 更新时间:2023-11-28 15:36:05 24 4
gpt4 key购买 nike

我正在尝试在将 url 加载到 webView 的应用程序中使用 MVC。我正在为如何/是否在模型或 viewController 中定义后退、前进、重新加载等功能而苦苦挣扎。我很确定它们属于模型,但是我如何在相应按钮的 IBAction 中调用它们?

在尝试调用 IBAction 中的类函数时,首先我必须在每个 IBAction 中创建一个 WebViewLoadRequest 实例,这似乎是无关紧要的。我不能(而且可能不应该)创建 WebViewLoadRequest 的全局实例,因为 self 在属性初始值设定项中不可用以引用 UIWebView Outlet

 class WebViewLoadRequest {
var outlet: UIWebView
var url : String
private var address: URL

init(outlet: UIWebView, url: String) {
self.outlet = outlet
self.url = url
self.address = URL(string: url)!
}

func load() {
self.outlet.loadRequest(URLRequest(url:address))
}

func back() {
if outlet.canGoBack {
outlet.goBack()
}
}

func forward() {
if outlet.canGoForward {
outlet.goForward()
}
}

func refresh() {
outlet.reload()
}

}

简化:

如何在model层编写如下函数并在ViewController中实现?

//outlet refers to a UIWebView
func back() {
if outlet.canGoBack {
outlet.goBack()
}
}

或者这应该严格来说是 View Controller 的一个功能?我意识到基本上只是 View 被改变了,但是在 goBack 操作的幕后发生了很多我不确定属于 ViewController 的事情

最佳答案

你在这里混淆了两件事 IMO,你在问题中描述了面向对象的编程。还有一个概念在Swift中是很常用的,也是很常见的,这个概念就是MVC。模型、 View 、 Controller 。这基本上是权力的分离。在实践中,这归结为:

Model - 具有所有逻辑的自定义类,在您的情况下为 WebViewLoadRequest

View - 在“ Storyboard”中定义

Controller - 将是 UIViewController 的子类,该子类还引用您的模型、所有 IBAction 和 IBOutlets 以连接和更新您的 UI。

您可以在此处了解有关 MVC 的更多信息:
https://www.raywenderlich.com/132662/mvc-in-ios-a-modern-approach

此外,我还强烈推荐观看 Paul Hegarty 在 Standford 开设的 C193p 类(class),这会教给您所有知识。例如第 4 周是关于 MVC
https://itunes.apple.com/us/course/developing-ios-10-apps-with-swift/id1198467120

编辑:基本上,您的构造是委托(delegate)构造。解决这个问题的正常方法是在你的模型类上创建一个委托(delegate)属性,委托(delegate)实现一个特定的协议(protocol),例如一个'canIGoBack'函数。模型可以通过调用委托(delegate)函数从委托(delegate)请求额外数据。 Apple 在他们的 swift 手册中有一些关于委托(delegate)的内容(检查“委托(delegate)”部分:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

我相信 Paul Hegarty 也讨论过。

但是,在这种情况下,也可以在 View Controller 中执行 canGoBack 并有条件地调用您的模型。 MVC 只是一个指导方针,有时在 View Controller 中执行逻辑有很多原因,最大的原因可能是它是否让事情变得更容易。大多数情况下,仅为 canGoBack 实现委托(delegate)是愚蠢的。

关于ios - Swift,如何在遵循 MVC 的同时声明需要实例成员的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com