iOS 第三课 九宫格建立 封装以及mvc的初步理解

本文深入探讨了MVC模式的设计理念,包括数据与控制器、视图的分离,懒加载方法的应用,以及属性get和set方法的使用技巧。通过具体实例讲解了如何实现良好的封装性和模块间的解耦。

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

1. mvc模式,  数据与 controller,与view的分离

2. 数据与controller分离   懒加载方法   属性get方法运用

3.view与controller分离    属性set方法的运用


总结:  类型的子属性不能显示在其他类中,否则不能叫做封装; 数据的传递需要通过定义 特定的数据属性 进行传递, 且在该属性的set方法中进行子属性的数据设置;



封装:  当一个对象 需要 model 或者 view的时候,此时controler能通过 “接口” 拿到自己想要的 model或者view, 而不知道model从哪里来,或者view中含有什么;

mvc模式: 以controller为中心,controller需要 modelData,以及展示view; 但是modelData数据最终是展示在 view中, 所以controller可以定义 model类型,而将model类型的对象赋予view,那么controller此时仅仅起到联系作用,三者相对独立;



下面以这个例子来总结 封装 以及mvc

1.首先controller 管理 model和view; 要拿到model,以及包含subview;

2.建立controller, 建立属性 NSArray * infos;

   controller中的数据采用懒加载的方式,即第一次需要的时候才加载,那么 

  - (NSArray *) infos

{

if( ! infos )

{

infos = [CZAppInfo appInfo];  //返回数据就行,controller只要数据,不管数据怎么来

}

}    

中加载数据最好;


3.controller中只需要最终的数据,不需要知道数据怎么来的,所以用类方法返回数据即可,数据的加载封装在另外的类中,即model

model中

+ (NSArray *) appInfo  //负责给出数据, 并且把数据的读取封装在本类中;

{

 NSString * path = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"];

    NSArray *  array = [NSArray arrayWithContentsOfFile:path];

    NSMutableArray * arrayInfos = [[NSMutableArray alloc] init];

    for ( NSDictionary * dic  in  array )

    {

        

        CZAppInfo * appInfo = [[CZAppInfo alloc] init];

        appInfo.name = [dic objectForKey:@"name"];

        appInfo.icon = [dic objectForKey:@"icon"];

        

        [arrayInfos addObject:appInfo];

    }

    return arrayInfos;

}



4.controller中要根据数据来展示view

首先,view需要组合出控件以满足复杂控件的显示, 只需要在controller中加载view就可以达到显示的正确,而不用管view到底怎么达到显示正确的过程;


- (void) loadSubViews

{

    float marginX = (CGRectGetWidth(self.view.bounds)-100*3)/4;

    float marginY = 30;

    float subWidth = 100;

    float subHeight= 100;

    

    NSInteger count = [self.appInfos count];  //懒加载数据,用到才第一次加载数据

    

    for ( int i=0 ; i<count; i++)

    {

        //封装自控件,无论子控件内部如何变化,也不影响controller

//       UIView * view = [[UIView alloc] init];2''2

        CZAppInfoView * view = [[[NSBundle mainBundle] loadNibNamed:@"CZAppInfoView" owner:nil options:nil] lastObject];

        view.appInfo = self.appInfos[i];

        view.frame = CGRectMake(marginX*(i%3+1)+(i%3)*subWidth, marginY*(i/3+1)+(i/3)*subHeight, subWidth, subHeight);

        

        [self.view addSubview:view];

    }

    

}




5.model 与 view的联系

controller的作用是管理model 和view , 所以 model 和view自己的任务 都要封装在自己的类中, controller只负责 拿到model类和view; 并且controller需要传递model给view;

这个时候用model类进行传递最好,在view中定义model类,且在model属性的set'方法中对view中的子属性进行初始化; 


首先必须明确: view中的子控件必须是私有成员属性 

为什么?因为封装!!!!   view的子属性不能暴露给controller,否则封装失败,此时要通过model类的属性来进行数据传递;

view.appInfo = self.appInfos[i];


//对外的属性: 增加set方法,在对外属性被赋值的时候,对内部属性也进行初始化

- (void) setAppInfo:(CZAppInfo *)appInfo

{

    if ( appInfo ) {

        

        _appInfo = appInfo;

        _imageView.image = [UIImage imageNamed:appInfo.icon];

        _nameLabel.text  = appInfo.name;

        [_iconLabel setTitle:@"下载" forState:UIControlStateNormal];

        

    }

}





nib的使用: nib用在view的局部控件中,用来组合复杂的控件集合使用,继承自view使用;

nib的加载方法: 相当与在bundle中去加载一个资源文件 

 CZAppInfoView * view = [[[NSBundle mainBundle] loadNibNamed:@"CZAppInfoView" owner:nil options:nil] lastObject];

view.appInfo = self.appInfos[i];







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值