我正在尝试在将 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/