基于oc实现阅读器文档1.docx_第1页
基于oc实现阅读器文档1.docx_第2页
基于oc实现阅读器文档1.docx_第3页
基于oc实现阅读器文档1.docx_第4页
基于oc实现阅读器文档1.docx_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要摘要: 随着移动互联网的迅速发展,尤其是3G,4G时代的到来,移动阅读成为人们一种更方便的阅读方式,一种充分利用生活碎片化时间的一种生活习惯。阅读器是一类资讯类的的产品,它将优质垂直内容整合与一体,提供最全面、最快捷的阅读体验,在阅读过程中通过分享,互动的方式,为用户提供更优质的阅读体验。此次研究使用下拉刷新和上拉加载进入刷新状态的时候会自动调用自定义方法实现刷新列表,使用Cell复用技术,其中的方法cellForRowAtIndexPath: 可以用于返回指定索引表格单元的路径,可以使用它来指定找到将要复用的部分并通过indexPath属性找到表中的索引路径定位行视图。关键词:IOS,Object-C,阅读器目录0. 分工41引 言41.1背景41.2国内外研究现状42关键技术介绍52.1开发环境52.2 关键技术介绍53. 系统分析53.1 功能构架53.2可行性分析64. 实现结果75测试76. 结论71引 言1.1背景在这个信息化的时代,IT业已经成为世界发展的主流,我们对信息技术的依赖远远超过了对我们自己的依赖,计算机和手机已经成为我们日常生活中不可缺少的获得信息的渠道。正因为如此,各种各样的软件层出不穷,我们的生活也因为各种各样的软件变得更有滋味。不缺乏娱乐性,也不缺乏教育意义,让我们从这些软件中受益匪浅,使我们看到了相比以前的巨大进步。同时,随着科技的发展,计算机越来越精致,手机也越来越智能化,随意我们的依赖性越来越大,越来越离不开这些给我们提供日常信息的工具。手机也已不再仅仅是简单的人与人通话的工具,而是在很大程度上成为了我们获取信息的一个更好的渠道。一个好的软件,能够标志一个手机品牌的地位。所以,开发一款好的手机软件是相当必要的。以前我们看看杂志,小说都要去图书馆借阅,而且时间有限,很不方便;而现在是在电脑上或者手机上看杂志,看小说,文档。在此看来,一个好的手机阅读器软件的开发时相当有必要的。1.2国内外研究现状阅读书籍是人类最基本的行为,阅读本身是对书籍上的内容进行综合了解和利用的方式。在电子出版物出现之前,人们主要获取信息并利用的途径是通过阅读图书、报纸、杂志等纸质版媒体出版物。但是在全新的多媒体数字信息阅览方式出现之后,多媒体信息包含文本音频,视频正在成为人们获取信息的信方式,而且多媒体信息占据人们阅读的比重越来越大,人们也就从纯纸质版出版物的阅读转变成为多媒体信息内容的阅读和充分使用。2关键技术介绍2.1开发环境2.1.1Objective-C简介 Objective-C是非常实际的语言。它是一个用C写成、很小的运行库,只会令应用程序的尺寸增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反。Objective-C写成的程序通常不会比其原始码大很多。而其函式库(通常没附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。因此,Objective-C它完全兼容标准C语言(C+对C语言的兼容仅在于大部分语法上,而在ABI(Application Binary Interface)上,还需要使用extern C这种显式声明来与C函数进行兼容),而在此基础上增加了面向对象编程语言的特性以及Smalltalk消息机制。2.1.2Xcode开发软件介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由苹果公司开发。Xcode是开发OS X 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。2.2 关键技术介绍2.2.1 下拉刷新技术 在使用下拉刷新和上拉加载进入刷新状态的时候会自动调用自定义方法实现刷新新闻列表,其步骤是首先封装请求参数,去除当前列表中的第一条数据并获取其数据id。接着是发送网络请求,通过使用字典数组把新数据添加到旧数据的前面。2.2.2 Cell复用技术 在UITableView框架中提供了访问元素部分的类方法,它是用于实现复用的基础。其中的方法- cellForRowAtIndexPath: 可以用于返回指定索引表格单元的路径,可以使用它来指定找到将要复用的部分并通过indexPath属性找到表中的索引路径定位行视图。2.2.3 Storyboard技术 (Storyboard)是一个能够节省很多设计手机App界面时间的新特性。2.2.4 XML数据处理技术使用NSXMLParser处理XML数据,程序需要先从XML文件中提取信息,然后再viewDidLoad方法中读取XML文件内容,创建NSXMLParser对象,设置其委托对象,并进行解析。3. 系统分析3.1 功能构架3.1.1 程序的总流程 阅读器系统流程和层次,展示如图3.1.1所示。 图3.1.1-1 层次流程图 图3.1.-2主要流程图图3.1-3 主要功能类图3.1.2程序用例图 本程序在运作时,用户可以有许多不同的操作,每种操作都会对之后的操作造成影响,这里用一个用例图来展示用户进行不同操作时程序的相应。如图3.1.2所示 图 3.1.2 阅读器用例图 3.1.3程序E-R图 本程序涉及到的数据库有用户的账号和密码以及用户的浏览记录。E-R图如图3.1.3所示。 图3.1.3 E-R图3.2可行性分析(1)此阅读器程序是由Objective-C编写而成,此语言功能齐全适用范围广,是一款经典好用的编程语言。由于语法和C语言接近所以很容易就可以掌握和使用。新手也能很快上手用本语言写出简单可行的程序。(2)本程序使用MVC架构,化繁为简。能够简单明了的找到程序每个模块对应的文件,并且进行修改。本程序看上去代码量比较大文件比较多,但是大多都由较简单的基础代码堆砌而成,对旧知识合理的运用,创造性地运用才是编程的重点。(3)本程序有用户账号密码的设置,登录的时候还需要输入正确的验证码,所以并不用担心用户信息的泄露。4. 实现结果4.1 个人信息界面4.2 书城界面可以分类查找各种图书,例如:男生、女生、热销、排行、主题、推荐等,查找完后可以添加到书架上,保存为自己喜欢。使用Storyboard搭建TabBar界面,设置与其相对应的ViewController,添加一个NavigationController,在导航栏上添加用户标签,设置其属性。4.3 搜索界面根据搜索结果添加书本到书架5编码实现1.书架implementation BookshelfViewControllerstatic NSString * const reuseIdentifier = Cell;- (void)viewDidLoad super viewDidLoad;deleteBtnFlag = YES;self.collectionView.backgroundColor = UIColor whiteColor;self addDoubleTapGesture;self setupDataBase;- (void)viewWillAppear:(BOOL)animatedbooksArr = YTBookItem readDatabase;/添加最后一项,是一个带加号的图YTBookItem *itm = YTBookItem allocinit;itm.imageKey = addbtnInshelf;booksArr addObject:itm;self.collectionView reloadData;#pragma mark - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section return UIEdgeInsetsMake(13,8,10,8);- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section #warning Incomplete implementation, return the number of itemsreturn booksArr.count;- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath YTBookCollectionViewCell *cell = collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath;YTBookItem *item = booksArrindexPath.row;cell.imageView.image = SDImageCache sharedImageCache imageFromDiskCacheForKey:item.imageKey;cell.bookNameView.text = ;/如果小说没有封面,就使用默认图if (cell.imageView.image = nil) cell.imageView.image = UIImage imageNamed:default_cover_blue;/如果是最后一项,则显示加号图if (item.imageKey isEqualToString:addbtnInshelf) cell.imageView.image = UIImage imageNamed:addbtnInshelf;cell.indexPath = indexPath;cell.deleteBtn.hidden = deleteBtnFlag?YES:NO;cell.delegate = self;return cell;2.书城#pragma mark - (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath return YES;- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath/如果点击最后一项,就跳转到书城界面if (indexPath.row = booksArr.count -1 ) self.tabBarController.selectedIndex = 1;elseif (indexPath.row = booksArr.count -1 ) self.tabBarController.selectedIndex = 1;else/ 需要参数 id url md b.a(authoer) cmd b.n(name) loc eid/ 1.由indexPath,从数组取bookitem对象YTBookItem *bookitem = booksArrindexPath.row;/2.根据name拼接表名,便于查询章节数据表NSString *tableStr = NSString stringWithFormat:t_%chapters,;/目前只读取第一章NSInteger pageIndex = 1;NSMutableArray *chaptersArray = NSMutableArray arrayWithArray: YTChaptersItem readOneChapterFromTable:tableStr Index:pageIndex;YTChaptersItem *chapterItem = YTChaptersItem allocinit;for (YTChaptersItem *chapter in chaptersArray) chapterItem = chapter;globalMD5 = chapterItem.md5;/有了 bookitem, chapteritem 就可以拼接url来请求数据了if (bookitem.bkey.length 8) /没有bkey的,值为(null) 所以长度至少要大于6 才能判断/有bkey/有bkey和没bkey请求的url不同,要分开/ 3.从bookitem里拿 id md b.a b.m loc,这一步不用写,用在拼接url字符串里NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject;/txt文件绝对路径NSString *TxtfilePath = NSStringstringWithFormat:%/%.txt,cacheDir,chapterItem.md5;NSStringEncoding strEncode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);NSString *txt = NSString stringWithContentsOfFile:TxtfilePath encoding:strEncode error:nil;YTNovelContentController *NCVC = self storyboardinstantiateViewControllerWithIdentifier:NovelContentVC;if (txt) /如果有文件,则直接推送到阅读器打开NCVC loadText:txt;self.navigationController pushViewController:NCVC animated:YES;else/如果没有文件,则执行下载操作,然后打开NSString *urlStr = NSString stringWithFormat:/s/api/ios/b/d?v=2&count=1&bkey=%&md5=%&uid=80C5B623E2F3031DC4B1874096C54217&token=4244558c08b4ee4e9791b06cca4ec139&eid=1136,bookitem.bkey,chapterItem.md5;self downloadZip:urlStr;else/没bkeyNSLog(nobkey);/中文作为请求参数,需要转义bookitem.author = bookitem.author stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding; = stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding;NSString *nobkeyUrlStr = NSString stringWithFormat:/apt/app/chapter?&id=%&url=%&md=%&b.a=%&cmd=%&b.n=%&loc=%&eid=1136,bookitem.bookid,chapterItem.url,bookitem.md,bookitem.author,chapterItem.cmd,,bookitem.loc;self NobkeyChapterContentRequest:nobkeyUrlStr;3. 搜索页面interface YTSearchViewController ()_block BOOL sectionHeaderFlag;_weak YTSearchFooter *weakfooter;NSUInteger pageInt;_block NSString *globalSearchKeyword;_block NSUInteger pagetotal; /请求的总页数,一旦达到了,那么下拉刷新无效property (nonatomic, strong) YTSearchBar *searchBar;property (nonatomic, copy) NSString *searchContent; / 搜索内容property (nonatomic, strong) YTSearchFooter *footer; / 推荐搜索property (nonatomic, strong) NSArray *hotSearchWords; / 推荐搜索关键词property (nonatomic,strong) NSMutableArray *resultArr; /搜索结果数组(存2个group对象)endimplementation YTSearchViewController/1 懒加载- (NSMutableArray *)resultArrif (_resultArr =nil) _resultArr = NSMutableArray array;return _resultArr;- (void)viewDidLoad super viewDidLoad;/一开始不显示sectionHeader,点击搜索时,根据搜索结果,来显示sectionHeaderFlag = NO;pageInt = 1;_hotSearchWords = 完美世界,大主宰,雪鹰领主,龙王传说,校花的贴身高手,武炼巅峰,帝霸,超品相师,武逆,换一换 ;self.tableView.bounces = NO;self setupNavBar;self setupFooter;self setupTableView;#pragma mark - Table view data source- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView #warning Incomplete implementation, return the number of sectionsreturn self.resultArr.count;- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section #warning Incomplete implementation, return the number of rowsYTresultGroup *group = _resultArrsection;return group.resultsArr.count;- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathif (indexPath.section = 0) YTResultCellWithbkey *cell = YTResultCellWithbkey resultCellWithbkeyWithTableView:tableView;YTresultGroup *groupWithbkey = _resultArr0;YTsearchResultItem *searchResultItem = groupWithbkey.resultsArrindexPath.row;cell setResultCellWithbkey:searchResultItem;return cell;elseYTResultCellNobkey *cell = YTResultCellNobkey resultCellNobkeyWithTableView:tableView;YTresultGroup *groupNobkey = _resultArr1;YTsearchResultItem *searchResultItem = groupNobkey.resultsArrindexPath.row;cell setResultCellNobkey:searchResultItem;return cell;#pragma mark - 点击cell-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPathYTDetailViewController *DetailVC = self storyboardinstantiateViewControllerWithIdentifier:DetailVC;YTDetailNobkeyViewController*DetailNobkeyVC= self storyboardinstantiateViewControllerWithIdentifier:DetailNobkeyVC;if (indexPath.section = 0) YTresultGroup *groupWithbkey = _resultArr0;YTsearchResultItem *searchResultItem = groupWithbkey.resultsArrindexPath.row;DetailVC.bkey = searchResultItem.bkey;DetailVC.bookName = searchResultItem.book;DetailVC.imageUrlStr = searchResultItem.picurl;DetailVC.bookid = searchResultItem.id;/ DetailVC.md = searchResultItem.md; /有bkey的实际上没idDetailVC.loc = searchResultItem.loc;DetailVC.author = searchResultItem.author;self.navigationController pushViewController:DetailVC animated:YES;elseYTresultGroup *groupNobkey = _resultArr1;YTsearchResultItem *searchResultItem = groupNobkey.resultsArrindexPath.row;DetailNobkeyVC.md = searchResultItem.md;DetailNobkeyVC.bookName = searchResultItem.book;DetailNobkeyVC.imageUrlStr = searchResultItem.picurl;DetailNobkeyVC.bookid = searchResultItem.id;DetailNobkeyVC.md = searchResultItem.md;DetailNobkeyVC.loc = searchResultItem.loc;DetailNobkeyVC.author =searchResultItem.author;self.navigationController pushViewController:DetailNobkeyVC animated:YES;#pragma mark -header样式- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section/ create the parent view that will hold header LabelUIView *customView = UIView alloc initWithFrame:CGRectMake(0, 0 , YTScreenWidth, 25);YTSectionHeaderView addHeaderToView:customView;return customView;#pragma mark - header高度- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)sectionif (section = 0) return 0;else if (section = 1)return 25;elsereturn 0;#pragma mark - cell高度- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath/两种cell的高度if (indexPath.section = 0) return 238;elsereturn 110;#pragma mark - 属性#pragma mark - 设置导航栏 以及搜索点击回调- (void)setupNavBar /跳转到下一界面的返回按钮样式UIBarButtonItem *backItem = UIBarButtonItem alloc init;backItem.title = ;self.navigationItem.backBarButtonItem = backItem;self.navigationItem.leftBarButtonItem = nil;self.navigationItem.hidesBackButton = YES;self.navigationItem.rightBarButtonItem = UIBarButtonItem barButtonItemWithTitle:取消target:selfaction:selector(cancel);self.searchBar = YTSearchBar searchBarWithPlaceholder:搜索书城图书;WeakSelf;dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(400 * NSEC_PER_MSEC), dispatch_get_main_queue(), weakSelf.searchBar becomeFirstResponder;weakSelf.tableView.bounces = YES;);self.navigationItem.titleView = self.searchBar;_weak YTSearchBar *wSearchBar = self.searchBar;self.searchBar.searchBarTextDidChangedBlock = / 文本编辑回调weakSelf.searchContent = wSearchBar.text;weakSelf.tableView reloadData; / 时刻刷新界面;self.searchBar.searchBarDidSearchBlock = / 搜索回调LBProgressHUD showHUDto:weakSelf.view animated:NO;weakSelf.tableView.tableHeaderView = nil;sectionHeaderFlag = YES;weakSelf.resultArr removeAllObjects;weakSelf.searchBar resignFirstResponder ;NSString *searchKeyword = weakSelf.searchBar.text;globalSearchKeyword = searchKeyword;NSString *pageStr = 1;NSDictionary *param = keyword:searchKeyword,json:1,p:pageStr,eid:1136;weakSelf searchRequest:param;/使能刷新weakSelf setupRefresh;LBProgressHUD hideAllHUDsForView:weakSelf.view animated:NO;#pragma mark - 设置按钮的词以及点击回调- (void)setupFooterYTSearchFooter *footer = YTSearchFooter alloc initWithFrame:CGRectMake(0, 0, YTScreenWidth, 270);footer.hidden = self.searchContent.length;footer.keywords = self.hotSearchWords;WeakSelf;weakfooter = footer;/ _weak YTSearchFooter *weakfooter = footer;/ 点击回调 点击就搜索footer.searchCallBack = (NSUInteger index) LBProgressHUD showHUDto:weakSelf.view animated:NO;weakSelf.tableView.tableHeaderView = nil;sectionHeaderFlag = YES;weakSelf.resultArr removeAllObjects;weakSelf.searchBar resignFirstResponder ;NSString *searchKeyword = weakSelf.hotSearchWordsindex;globalSearchKeyword = searchKeyword;weakSelf.searchBar setText:searchKeyword;NSString *pageStr = 1;NSDictionary *param = keyword:searchKeyword,json:1,p:pageStr,eid:1136;weakSelf searchRequest:param;/使能刷新weakSelf setupRefresh;LBProgressHUD hideAllHUDsForView:weakSelf.view animated:NO;/点击换一换,回调,改变数组footer.changeKeyWord = (NSUInteger index)LBProgressHUD showHUDto:weakSelf.view animated:NO;NSString *startParm = YTparamLoop paramLoop;NSDictionary *param = rank:resou,start:startParm,length:9,json:1,eid:1136;weakSelf keywordsRequest:param;LBProgressHUD hideAllHUDsForView:weakSelf.view animated:NO;/ self.tableView.tableFooterView = footer;self.tableView.tableHeaderView = footer;self.footer = footer;# pragma mark - 设置header footer高度- (void)setupTableView self.tableView.sectionHeaderHeight = 0.1;self.tableView.sectionFooterHeight = 0.1;#pragma mark - 点击取消,返回上一界面-(void)cancelYTNavAnimation NavPopAnimation:self.navigationController.view;self navigationController popViewControllerAnimated:NO;#pragma mark - 点击“换一换”,修改关键词-(void)keywordsRequest:(NSDictionary *)paramAFHTTPRequestOperationManager *manager = AFHTTPRequestOperationManager manager;manager GET :keyWordsUrlparameters:paramsuccess:(AFHTTPRequestOperation *operation, id responseObject) NSArray *tempArr = YTsearchKeyWords mj_objectArrayWithKeyValuesArray:responseObject valueForKey:list;NSMutableArray *tempStrArr = NSMutableArray array;for (YTsearchKeyWords *k in tempArr) tempStrArr addObject:k.book;tempStrArr addObject:换一换;/修改数组_hotSearchWords = tempStrArr;/改变按钮内容weakfooter setKeywords:self.hotSearchWords;failure:(AFHTTPRequestOperation *operation, NSError *error) NSLog(%,error);#pragma mark - 搜索的网络请求-(void)searchRequest:(NSDictionary *)paramAFHTTPRequestOperationManager *manager = AFHTTPRequestOperationManager manager;manager GET :searchUrlparameters:paramsuccess:(AFHTTPRequestOperation *operation, id responseObject) /取总体模型,可以得到 pagenum, pagesize ,pagetotal, totalnum 这4个有用的数据YTsearchAllResult *allresult = YTsearchAllResult mj_objectWithKeyValues:responseObject;pagetotal = allresult.pagetotal;NSMutableArray *tempArr = YTsearchResultItem mj_objectArrayWithKeyValuesArray:responseObject valueForKey:list;YTresultGroup *groupWithbkey = YTresultGroup allocinit;YTresultGroup *groupNobkey = YTresultGroup allocinit;YTresultGroup *realGroupWithbkey = YTresultGroup allocinit;YTresultGroup *realGroupNobkey = YTresultGroup allocinit;/1.加载更多时,先取出 groupNobekyif (_resultArr.count 1) realGroupWithbkey = _resultArr0;realGroupNobkey = _resultArr1;for (YTsearchResultItem *r in tempArr) if (r.bkey isEqualToString: ) groupNobkey.resultsArr addObject:r;elsegroupWithbkey.resultsArr addObject:r;realGroupNobkey.resultsArr addObjectsFromArray:groupNobkey.resultsArr;realGroupWithbkey.resultsArr addObjectsFromArray:groupWithbkey.resultsArr;/如果第一次,就直接装入数组if (_resultArr.count 1) _resultArr addObject:groupWithbkey;_resultArr addObject:groupNobkey;else /如果是加载更多数据操作,就更新数组_resultArr replaceObjectAtIndex:0 withObject:realGroupWithbkey;_resultArr replaceObjectAtIndex:1 withObject:realGroupNobkey;self.tableView reloadData;failure:(AFHTTPRequestOperation *operation, NSError *error) NSLog(%,error);4. 上拉刷新#pragma mark - 上拉加载设置 自定义文字 和图片- (void)setupRefresh/ 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)YTRotateRefreshIco

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论