从代码看iOS设计模式之MVP

本文通过一个具体的示例,详细介绍了MVP(Model-View-Presenter)设计模式的核心概念及其实现方式。展示了如何分离视图控制器中的业务逻辑,使代码更加清晰、易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//: 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的设计核心,认真吃透,受益无穷




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值