五分钟搭建App设置页面_纯代码 + 模型思想(OC)

本节主题(Storyboard/模型思想搭建设置页面)

  • 源码地址在文章末尾
  • 设置(Setting)页面的搭建(实现效果)


    效果图
    • 注:本文部分图标及效果图来自[IT江湖] https://github.com/itjhDev/itjh

  • 开发方式(这里提供两种,个人感觉第二种重用性较高,推荐使用。但第一种较为简单,视开发需求选择)
    • (1)纯代码 + StoryBoard混合 开发
    • (2)纯代码 + 模型 思想
  • 设置页面的搭建
  • 假设你已经搭建出了这个基本框架
    《十分钟搭建App主流框架》
    但这毕竟是个空壳,下面让我们把设置页面简单的搭建一下吧
  • 注:本文仅仅提供简略的搭建方式与实现思路,更加详细的功能需要读者深入探究。

方式一(纯代码 + StoryBoard混合 开发)

  • 第一步
    • 新建StoryBoard文件,注意:命名与控制器相同
Snip20150911_5.png
  • 第二步
    • 往StoryBoard一顿狂拖,你懂的


      Snip20150911_2.png
    • 注意点:记得勾选第一个页面 is Initial View Controller
      Snip20150911_13.png
    • 设置TableViewCell的样式


      Snip20150911_14.png
  • 第三步(回到CYXTabBarController.m文件)
    • 这里只需要改第四个控制器的代码,由于是从Storyboard中加载的控制器,与前三个不同。
Snip20150911_15.png
/**
 *  添加所有子控制器
 */
- (void)setUpAllChildViewController{
    // 1.添加第一个控制器
    CYXOneViewController *oneVC = [[CYXOneViewController alloc]init];
    [self setUpOneChildViewController:oneVC image:[UIImage imageNamed:@"tab_home_icon"] title:@"首页"];

    // 2.添加第2个控制器
    CYXTwoViewController *twoVC = [[CYXTwoViewController alloc]init];
    [self setUpOneChildViewController:twoVC image:[UIImage imageNamed:@"js"] title:@"技术"];

    // 3.添加第3个控制器
    CYXThreeViewController *threeVC = [[CYXThreeViewController alloc]init];
    [self setUpOneChildViewController:threeVC image:[UIImage imageNamed:@"qw"] title:@"博文"];

    // 4.添加第4个控制器
    // 4.1 初始化并从Storyboard中加载控制器
    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"CYXFourViewController" bundle:nil];
    
    // 4.2 关联storyBoard与CYXFourViewController
    CYXFourViewController *fourVC = [storyBoard instantiateInitialViewController];

    [self setUpOneChildViewController:fourVC image:[UIImage imageNamed:@"user"] title:@"设置"];
}

  • 设置页面已经出来了
Snip20150912_18.png

方式二(纯代码 + 模型 开发)

  • 第一步 (新建模型文件)
Snip20150911_17.png
  • 第二步 (模型的设计)

    • 组模型设计(CYXGroupitem.h),分析每一组的所有元素:比如有头部标题,尾部标题,还有若干行Cell
    @interface CYXGroupItem : NSObject
    /** 头部标题 */
    @property (strong, nonatomic) NSString * headerTitle;
    /** 尾部标题 */
    @property (strong, nonatomic) NSString * footerTitle;
    /** 组中的行数组 */
    @property (strong, nonatomic) NSArray * items;
    @end
    
    
    • 行模型的设计(CYXSettingItem.h),分析每一行的所有元素:比如只有标题
      @interface CYXSettingItem : NSObject
      @property (strong, nonatomic) NSString * title;/**< 标题 */
      + (instancetype)itemWithtitle:(NSString *)title;/**< 设置标题值 类方法 */
      @end
      
      
    • 类方法的实现(CYXSettingItem.m)

      + (instancetype)itemWithtitle:(NSString *)title{
      CYXSettingItem *item = [[CYXSettingItem alloc]init];
      item.title = title;
      return item;
      }
      
      
  • 第三步 回到设置页面的控制器(CYXFourViewController.m)

    • (1) 实现< UITableViewDataSource >协议的3个方法
    • (2) 给对应的模型设置值
#import "CYXFourViewController.h"
#import "CYXSettingItem.h"
#import "CYXGroupItem.h"

@interface CYXFourViewController ()

@property (strong, nonatomic) NSMutableArray * groups;/**< 组数组 描述TableView有多少组 */

@end

@implementation CYXFourViewController
/** groups 数据懒加载*/
- (NSMutableArray *)groups
{
    if (!_groups) {
        _groups = [NSMutableArray array];
    }
    return _groups;
}


- (instancetype)init{

    // 设置tableView的分组样式为Group样式
    return [self initWithStyle:UITableViewStyleGrouped];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    //添加第1组模型
    [self setGroup1];
    //添加第2组模型
    [self setGroup2];
    //添加第3组模型
    [self setGroup3];

}

- (void)setGroup1{
    // 创建组模型
    CYXGroupItem *group = [[CYXGroupItem alloc]init];
    // 创建行模型
    CYXSettingItem *item = [CYXSettingItem itemWithtitle:@"我的账号"];
    CYXSettingItem *item1 = [CYXSettingItem itemWithtitle:@"我的收藏"];

    // 保存行模型数组
    group.items = @[item,item1];
    // 把组模型保存到groups数组
    [self.groups addObject:group];
}

- (void)setGroup2{

    CYXGroupItem *group = [[CYXGroupItem alloc]init];

    CYXSettingItem *item = [CYXSettingItem itemWithtitle:@"我去好评"];
    CYXSettingItem *item1 = [CYXSettingItem itemWithtitle:@"我去吐槽"];

    group.items = @[item,item1];

    [self.groups addObject:group];
}

- (void)setGroup3{

    CYXGroupItem *group = [[CYXGroupItem alloc]init];

    CYXSettingItem *item = [CYXSettingItem itemWithtitle:@"关注我们"];
    CYXSettingItem *item1 = [CYXSettingItem itemWithtitle:@"关于我们"];

    group.items = @[item,item1];

    [self.groups addObject:group];
}

#pragma mark - TableView的数据源代理方法实现

/**
 *  返回有多少组的代理方法
 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return self.groups.count;
}
/**
 *  返回每组有多少行的代理方法
 */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    CYXGroupItem *group = self.groups[section];
    return group.items.count;
}

/**
 *  返回每一行Cell的代理方法
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // 1 初始化Cell
    // 1.1 设置Cell的重用标识
    static NSString *ID = @"cell";
    // 1.2 去缓存池中取Cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    // 1.3 若取不到便创建一个带重用标识的Cell
    if (cell == nil) {
        cell  = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
    // 设置Cell右边的小箭头
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    // 2 设置数据
    // 2.1 取出组模型
    CYXGroupItem *group = self.groups[indexPath.section];
    // 2.2 根据组模型取出行(Cell)模型
    CYXSettingItem *item = group.items[indexPath.row];
    // 2.3 根据行模型的数据赋值
    cell.textLabel.text = item.title;

    return cell;
}

@end

  • 实现效果


    Snip20150911_16.png
  • 如果你希望使用方式二实现点击Cell的跳转,需要实现下面的方法,并在里面调用navigationController的pushViewController方法跳转到你自定义的控制器。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
    
  • 看到这里,如果你是个iOS初学者,应该觉得方式2的实现过于繁琐,但方式2却是个一劳永逸的方式。换句话说,如果你用方式2封装了一个完整的设置页面的框架,在下一个项目中,再有类似的设置页面,你便可以直接把这个框架拷贝过去,改少量的代码便可以完美兼容,肯定比你再重新拖Storyboard要便捷,因此本人是比较推崇这种方式的。

  • 附:源码github地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,342评论 2 4
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 一 、使用git管理工程 1、可以使用OSChina远程管理工程(免费) 2、可以使用GitHub网站进行远程管理...
    YuGHo阅读 2,339评论 1 3
  • 如果说写作也算创造的话,我就有了成就感(悄悄地跟你说,还没发表过)。当然,本就有“创作”之词在那里,只是我的只算着...
    章节阅读 230评论 0 0
  • 文 | 彼怀 时间还很长,还有很多未知的疯狂等着你。别犹豫,向前冲。 2017/10/01 星期日 ...
    彼怀阅读 292评论 16 20