//: Playground - noun: a place where people can play
import UIKit
import XCPlayground
// Model
struct Person {
let firstName: String
let lastName: String
}
// 下面这个protocol 不是必要的
protocol GreetingView: class {
func setGreeting(greeting: String)
}
// 连接model 和 viewcontroller 的中间件,从初始化方法就可以看出
// 这个protocol 只与viewcontroller 对应的Presenter 发生联系
// Presenter 进行的应该是处理model
//
protocol GreetingViewPresenter {
init (view : GreetingViewController, person : Person)
func showGreeting()
}
//Presenter
// 把viewcontroller里处理数据的代码分离到Presenter 中,为viewcontroller 瘦身
// 也不一定只是处理数据的代码,也可以是别的操作
class GreetingPresenter : GreetingViewPresenter {
let view : GreetingViewController
var person : Person
required init(view: GreetingViewController, person: Person) {
self.view = view
self.person = person
}
func showGreeting() {
//处理model 数据
let greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName
//处理后的数据做什么用?
//应该回到viewcontroller 中去使用这个数据
self.view.setGreeting(greeting: greeting)
}
}
//View
class GreetingViewController: UIViewController, GreetingView {
//第一步,定义Presenter 的一个变量
var presenter : GreetingPresenter!
let showGreetingButton = UIButton()
let greetingLabel = UILabel()
override func viewDidLoad() {
self.showGreetingButton.addTarget(self, action: #selector(didTapButton(button:)), for: .touchUpInside)
viewLayoutInitial()
}
//数据处理起始点
func didTapButton(button : UIButton) {
self.presenter.showGreeting()
}
//实际使用数据的方法
func setGreeting(greeting: String) {
self.greetingLabel.text = greeting
}
func viewLayoutInitial() {
self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480)
self.view.backgroundColor = UIColor(white: 1.0, alpha: 1.0);
self.showGreetingButton.frame = CGRect(x: 10.0, y: 10.0, width: 90.0, height: 30.0)
self.showGreetingButton.layer.cornerRadius = 6.0
self.showGreetingButton.backgroundColor = UIColor.blue
self.greetingLabel.frame = CGRect(x: 10.0, y: 60.0, width: 200.0, height: 20.0)
self.greetingLabel.textColor = UIColor.blue
self.greetingLabel.text = "Say hello to who?"
self.view.addSubview(self.showGreetingButton);
self.view.addSubview(self.greetingLabel)
}
}
//Assembling of MVP
let model = Person(firstName: "David", lastName: "Blaine")
let view = GreetingViewController()
let presenter = GreetingPresenter(view: view, person: model)
view.presenter = presenter
//XCPlaygroundPage.currentPage.liveView = view.view
转的别人的代码,原作者链接找不到了
这段代码完整地体现了MVP的设计核心,认真吃透,受益无穷