Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1524044
  • 博文数量: 465
  • 博客积分: 8915
  • 博客等级: 中将
  • 技术积分: 6365
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-30 15:05
文章分类

全部博文(465)

文章存档

2017年(33)

2016年(2)

2015年(4)

2014年(29)

2013年(71)

2012年(148)

2011年(178)

分类: IT业界

2011-06-09 13:13:30

iPhone企业应用实例分析之三:程序框架分析


WebDoc Mobile项目是典型的多层流程型系统,所以系统主要使用UINavigation Controller进行用户界面的导航,这样当用户从上一层界面进入下一层界面,在下一层界面的事情处理完以后,又可以方便地返回到上一层界面,在用户登录系统以后,系统显示主菜单,如图5-6所示。
主菜单分为4个选项,即“我的文档”、“部门文档”、“高级搜索”和“统计图”, 主菜单在MainViewController类中实现,该类使用UITableView来对菜单项进行管理, UITableView的数据源使用一个NSMutableArray来提供表格数据,表格绘制时,使用以下命令。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section{


 return menuList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
   NSDictionary *dataDictionary = [menuList    objectAtIndex:indexPath.row];
    cell.textLabel.text = [dataDictionary valueForKey:kTitleKey];
    return cell;
}
返回表格行数和每行的具体内容,每行表格数据包含下一层ViewController界面的标题和类名称,当用户单击主菜单的菜单项时,程序先使用该类名称调用NSClassFromString()创建类对象,然后再创建ViewController对象,并将ViewController加入UINavigation Controller中进行界面显示。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath{
targetViewController = [[NSClassFromString(viewControllerName) alloc] initWithNibName:viewControllerName bundle:nil];
[self.navigationController pushViewController:targetViewController animated:YES];
}
在用户选择“我的文档”或者选择“部门文档”界面的具体部门后,以及使用“文档搜索”功能搜索文档后,程序就显示文档列表,如图5-7所示。
 


文档列表显示使用DocListViewController类实现,该类包含文档记录分页,前后导航功能,当记录超过每页记录显示的最大行数时,用户可以使用前向和后向箭头进行翻页,另外在用户进行搜索以后,程序也使用这个类来显示搜索结果。
DocListViewController类包含一个UITableView成员变量,程序使用这个表格来显示文档列表,表格的数据源使用一个NSMutableArray来存储和提供数据,这个数组的每个元素都是一个DocumentDetailViewController类实例,在文档列表显示前使用一个遍历来创建这些DocumentDetailViewController类实例。
for(i = 0; i < nResult; i++){
  DocumentDetailViewController *presidentsViewController =
  [[NSClassFromString(viewControllerName) alloc]
   initWithNibName:viewControllerName bundle:nil];   
  Document *doc = [objects objectAtIndex:i];
  presidentsViewController.title = doc.documentName;
  [presidentsViewController setDocument:doc];
  [controllers addObject:presidentsViewController];
  [presidentsViewController release];      
}
当用户单击文档列表中的某个文档时,程序就从数组中取出对应的元素,然后显示DocumentDetailViewController对象。
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    NSUInteger row = [indexPath row]; 
 if(self.controllers != nil){  
  DocumentDetailViewController *nextController = [self.controllers
              objectAtIndex:row]; 
  //preload detail, attachment and history.
  [nextController preLoadData];
     
  //clear cache
  [self handleWithCache]; 
 
  //push document detail view...
  [self.navigationController pushViewController:nextController animated:YES];
 } 
}
因为DocumentDetailViewController类需要包含的内容较多,所以程序使用分页显示的方式来组织这些内容,DocumentDetailViewController类使用一个UISegmentedControl类来管理文档详情、文档附件、文档历史和工作流4个具体页面,如图5-8所示。
这样,当用户进入文档详情的时候,就可以方便地在文档附件、文档历史等页面之间进行切换,在DocumentDetailViewController类的viewDidLoad()方法中通过addTarget()函数设置UISegmentedControl页面切换时的响应函数,这个响应函数在UISegmentedControl对象创建时进行设置,这里设置的是didChangeSegmentControl函数。
self.segmentedControl = [[UISegmentedControl alloc] initWithItems:segmentTitles];
[self.segmentedControl addTarget:self
  action:@selector(didChangeSegmentControl:)
  forControlEvents:UIControlEventValueChanged];
当用户在页面之间切换时,这个函数就得到调用,函数首先将当前活动页面移除,然后再激活并显示用户选择的页面。
 



- (void)didChangeSegmentControl:(UISegmentedControl *)control {
    if (self.activeViewController) {
        [self.activeViewController viewWillDisappear:NO];
        [self.activeViewController.view removeFromSuperview];
        [self.activeViewController viewDidDisappear:NO];
    }
   
    self.activeViewController = [self.segmentedViewControllers objectAtIndex: control.selectedSegmentIndex];
 [self.activeViewController viewWillAppear:YES];
    [self.view addSubview:self.activeViewController.view];
    [self.activeViewController viewDidAppear:NO]; 
   
}
这样就实现了在4个页面之间进行切换、隐藏和显示的功能。DocumentDetailView Controller类通过UISegmentedControl类来组织页面内容是程序的主体所在,也是编程的重点,该类通过另外4个类来组织和管理页面内容,另外4个类分别是DocDetailView Controller类,用来显示文档明细;DocFilesViewController类,用来管理文档附件;DocHistoryViewController类,用来管理文档变更历史;DocWorkflowViewController类,实现工作流管理。
当用户单击“部门文档”主菜单时,程序显示部门列表界面,如图5-9所示。
当用户选择具体部门时,程序通过Web Service查询服务器端的后台数据库,然后将服务器返回数据进行显示,即显示用户所选部门当前处理中的文档列表。
当用户选择“统计图”主菜单时,程序列出系统现有的统计图列表,如图5-10所示。
在用户单击统计图明细图标   时,程序通过Web Service查询服务器端后台数据库,并根据返回数据将统计图显示在手机上,如图5-11所示。


            

本文节选自《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》一书。
《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》一书已由电子工业出版社正式出版,本书由虞斌著。

购买地址:

互动出版网:

阅读(548) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~