我正在尝试在应用程序中使用MVC将url加载到webView中。我在为如何/是否定义后退、前进、重新加载等而挣扎。。。模型或视图控制器中的函数。我很确定它们属于模型,但是我如何在IBAction中为相应的按钮调用它们呢?
在试图调用IBAction中的类函数时,首先必须在每个IBAction中创建一个WebViewLoadRequest实例,这看起来是无关的。我无法(可能也不应该)创建WebViewLoadRequest的全局实例,因为在属性初始值设定项中无法使用self来引用UIWebView出口
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()
}
}
要简化:
如何在模型层中编写以下函数并在ViewController中实现?
//outlet refers to a UIWebView
func back() {
if outlet.canGoBack {
outlet.goBack()
}
}
或者这应该是视图控制器的一个功能吗?我意识到实际上只是视图被改变了,但是在goBack操作中有很多幕后操作,我不确定是否属于ViewController
最佳答案
你在这里混淆了两件事,在我看来,有一个面向对象的编程,你在你的问题中描述过。还有另一个在Swift中常用的概念,这个概念就是MVC。模型,视图,控制器。这基本上是权力的分离。实际上,这可以归结为:
Model-具有所有逻辑的自定义类,在您的例子中是WebViewLoadRequest
视图-在“故事板”中定义
控制器-将是UIViewController的一个子类,该子类还引用了您的模型、所有要连接和更新UI的ibaction和iboutlet。
您可以在此处了解有关MVC的更多信息:
https://www.raywenderlich.com/132662/mvc-in-ios-a-modern-approach
另外,我强烈建议您观看保罗·海加蒂在斯坦福德举办的C193p课程,这将教会您所有的知识。例如第四周是关于MVC的
https://itunes.apple.com/us/course/developing-ios-10-apps-with-swift/id1198467120
编辑:
基本上你的构建是一个委托的构建。解决这个问题的通常方法是在模型类上创建一个delegate属性,这个delegate使用例如“canIGoBack”函数实现一个特定的协议。模型可以通过调用委托函数从委托请求额外的数据。苹果在其swift手册中有一些关于授权的内容(请查看“授权”部分:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html
我相信保罗·赫加蒂也讨论过。
但是,在这种情况下,在viewcontroller中执行canGoBack并有条件地调用模型也是可以的。MVC只是一个指导原则,有时候在viewcontroller中做逻辑有很多原因,最大的原因可能是它让事情变得更简单。大多数时候,只为一个canGoBack执行委派只是愚蠢的。