序 相信做iOS开发的小伙伴们经常会遇到这样的页面: 对于这样的静态列表我们可以直接用 storyboard

相信做iOS开发的小伙伴们经常会遇到这样的页面:

对于这样的静态列表我们可以直接用 storyboard 拖一个出来,或者直接用代码创建。我个人的话会选择用代码直接创建,但是之前一直有的问题是没有较好的数据源表示方式,需要对 indexPath 进行硬编码,这导致了在 tableView 的代理里面需要进行判断:


  1. if (indexPath.section == 0) { 
  2.     if (indexPath.row == 0) { // email 
  3.         // do something 
  4.     } else if (indexPath.row == 1) { // phone 
  5.         // do something 
  6.     } 
  7. } else if (indexPath.section == 1) { 
  8.     // do something 
  9. }  

稍微好点的会在相关的判断边上做注释,但是这样写依然容易在往后(产品)调整顺序时调整了一个地方而忘记另外的,总的来说就是代码不够优雅。基于这样的背景,在尝试了各种方式之后,产生了一个可行的解决方案 —— WAMSimpleDataSource。

设计思路

在定义 WAMCellInfo 和 WAMSectionInfo 两个类时我选择引入别名( alias )来解决 indexPath 的硬编码问题(可能有人会说alias也是硬编码,但这样做提升了代码的可读性=0=)。

WAMCellInfo

WAMCellInfo 为 cell 的创建提供了最基本的信息,如 reuseIdentifier ,title,detail。用户也能传入自定义的 cell 而不必担心循环引用的问题。

WAMSectionInfo

WAMSectionInfo 作为 WAMCellInfo 的容器,提供了添加,删除,替换,以及基于 alias 对 WAMCellInfo 和 WAMCellInfo 的索引方法。

WAMDataSource

WAMDataSource 是所有 WAMSectionInfo 的容器,同样提供了添加,删除,替换,以及基于 alias 对 WAMSectionInfo 的索引方法。

Demo

让我们就以一个简单的 demo 看下 WAMSimpleDataSource 在静态列表中如何能让代码看起来更简洁。


  1. static NSString *const kReuseIdentifier     = @"tableViewCellIdentifier"; 
  2. static NSString *const kIdentifierCellAlias = @"kIdentifierCellAlias"; 
  3. static NSString *const kSelfDefineCellAlias = @"kSelfDefineCellAlias"; 
  4.  
  5. static NSString *const kSectionZeroAlias = @"kSectionZeroAlias"; 
  6. static NSString *const kSectionOneAlias  = @"kSectionOneAlias"; 
  7.  
  8. #pragma mark - Initialization 
  9.  
  10. // section info初始化 
  11. WAMSectionInfo *zero = [WAMSectionInfo infoWithCellInfos:@[] alias:kSectionZeroAlias]; 
  12. // 添加操作,cell info初始化 
  13. [zero appendingCellInfo:[WAMCellInfo infoWithSelfDefineCell:self.customizedCell alias:kSelfDefineCellAlias]]; 
  14.  
  15. WAMSectionInfo *one = [WAMSectionInfo infoWithCellInfos:@[ 
  16.         [WAMCellInfo infoWithReuseIdentifier:kReuseIdentifier title:nil detail:nil alias:kIdentifierCellAlias] 
  17.     ] alias:@"oneSectionAlias"]; 
  18.  
  19. // data source初始化 
  20. self.dataSource = [WAMDataSource dataSourceWithSectionInfos:@[zero, one]]; 
  21.  
  22. #pragma mark - UITableViewDataSource 
  23.  
  24. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
  25.     return self.dataSource.sectionInfos.count; 
  26.  
  27. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
  28.     return self.dataSource.sectionInfos[section].cellInfos.count; 
  29.  
  30. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
  31.     WAMCellInfo *cellInfo = self.dataSource.sectionInfos[indexPath.section].cellInfos[indexPath.row]; 
  32.     __kindof UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellInfo.identifier forIndexPath:indexPath]; 
  33.  
  34.     // 根据不同的alias进行不同的操作 
  35.     if ([cellInfo.alias isEqualToString:kSelfDefineCellAlias]) { 
  36.         // do something 
  37.     } else if ([[cellInfo.alias isEqualToString:kIdentifierCellAlias]) { 
  38.         // do something 
  39.     } 
  40.     . 
  41.     . 
  42.     . 
  43.  
  44.     return cell; 
  45.  
  46. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
  47.     return self.dataSource.sectionInfos[section].sectionHeaderHeight; 
  48.  
  49. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 
  50.     return self.dataSource.sectionInfos[section].sectionFooterHeight; 
  51. }  

总结与缺陷

现在的 WAMDataSource 还没办法做到直接作为 tableView 的数据源,这是在今后的更新中会解决的问题。虽然 WAMSimpleDataSource 并没有减少很多代码量,但能提升静态列表中代码的可读性以及可维护性,个人觉得还是值得的。

作者:WAMaker

来源:51CTO

时间: 2024-11-01 16:22:56

序 相信做iOS开发的小伙伴们经常会遇到这样的页面: 对于这样的静态列表我们可以直接用 storyboard的相关文章

iOS开发工具:网络封包分析工具Charles详解

简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析. Charles是收费软件,可以免费试用30天.试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时. 因此,该付费方案对广大用户还是相当友好的,即使你长期不付费,也能使用完整的

ios开发 布局-iOS应用内加载Web如何实现内置Safari的效果(见图)

问题描述 iOS应用内加载Web如何实现内置Safari的效果(见图) 应用内夹在Web如何实现内置Safari的效果(见图) 顶部和底部栏特征开发 布局-iOS应用内加载Web如何实现内置Safari的效果(见图)-safari 加载完毕事件"> 解决方案 这个需要你自己做网页内容或者做iOS控件 解决方案二: 要么直接调用Safari,要么使用webview,要么自己制作一个Safari 风格的view 解决方案三: 这个需要你自己做网页内容或者做iOS控件. 解决方案四: 在自己的w

[翻译] iOS开发工具的介绍(第一部分)

IOS DEVELOPMENT TIPS & TRICKS - PART I http://blog.trifork.com/2013/12/19/ios-development-tips-tricks-part-i/   As you might know, I am very fond of developing apps for the iOS platform. I started back in mid-2009 by trying to create an app for the D

iOS开发:创建真机调试证书

方法/步骤 1 首先打开苹果的开发者网站(Tips:这里我就不贴网址了) 点击网站上方的Member Center,会跳转到登录界面(Tips:如果登录过,并选择了浏览器保存此密码的时候,默认是登录状态). 2 如图所示输入你的开发者账号和密码. 输入完成后点击"Login"(Tips:左边是注册,下边是找回密码,右边是登录,如果没有开发者账号,则需要用苹果账号申请开发者,这里不多说申请过程以及找回过程). 3 登录后的界面如图所示,如果没有最上面的两个选项(Dev Centers.C

ios开发-如何使用mac笔记本的触摸板控制iOS模拟器

问题描述 如何使用mac笔记本的触摸板控制iOS模拟器 如题, 在做iOS开发的时候, 模拟器的手势都是用点按触摸板, option键等实现的, 我怎么样才能直接使用触摸板的手势来使模拟器响应 最简单的, 怎么在触摸板上双手向上就可以让模拟器向下翻页 解决方案 笔记本触摸板使用心得

iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center 应用内购买 iCloud Passbook 目 录 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定

苹果ios开发中的plist文件的读写的例子

前言:在做iOS开发时,经常用到plist文件,  那么,plist文件究竟是什么呢? 在此,我做一个简单的介绍和使用,它全名是:Property List,属性列表文件,它是一种用来存储串行化后的对象的文件.属性列表文件的扩展名为.plist ,因此通常被称为 plist文件,文件是xml格式. Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息,同时也可以用来存储其他的信息. 下面,我将创建一个项目来学习plist文件的读写. 1.创建项目demo 项目创建之后可以找到项目对应的p

非技术-现在开发一个新游戏,应该先做iOS版还是Android版?

问题描述 现在开发一个新游戏,应该先做iOS版还是Android版? 之前一直觉得是从iOS版开始,但是最近听到几个朋友说iOS审核慢,刷榜厉害,而且用户数也远不如Android了.大家怎么看? 解决方案 重要的是看技术(开发哪个更容易),周期更短.更有app store推广经验若游戏成熟,两个最终都要做的,目前这态势,看你定位了,不然暂不用考虑用户数问题 解决方案二: 我基本是根据利益获取模式,如果是想App收费,会先做iOS的,如果是道具收费.免费,就根据开发的情况来定.2个平台都会做,但是

ios开发的时候什么也没做就报下面的错误,sdwebimage是cocoapos导入的怎么回事呀

问题描述 ios开发的时候什么也没做就报下面的错误,sdwebimage是cocoapos导入的怎么回事呀