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

标签 ios swift oop model-view-controller

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

相关文章:

java - 从外部包实例化 protected 类

c++ - 模板与多态性

java - 自 Java 8 以来是否有使用 getter 和 setter 的新论点?

ios - 核心数据单元未正确更新

ios - 使用多点触控解决触摸冲突

macos - OS X 10.10 Yosemite - 添加菜单

swift - UIDatePicker 倒数计时器模式在 Xcode 10.3 中不会返回正确的时间

ios - Xamarin - 构建绑定(bind)库 Messaging.g.cs 时出错

objective-c - UIDocumentInteractionController : "Open In" visible on iPhone but not on iPad - why?

ios - 将 [String] 存储在 NSUserDefaults 中