项目功能大全,让你的项目一天搞定(给新手们一点干货)

本文旨在帮助新手快速上手项目开发,从确定需求到实现功能,包括导航栏设置、搜索功能(UISearchBar 和 UISearchController)、图片下载、收藏功能、登录注册、清除缓存、分享与二维码生成、推送通知以及聊天功能的实现。通过实例代码和步骤解析,助你一天搞定项目。
摘要由CSDN通过智能技术生成

在互联网中心工作了好久一直很忙,好不容易有些时间,今天有人问我如何开始写一个项目,不禁回忆起自己写第一个项目的时候,到现在,突然感觉自己写的好多都是在重复,有些感想,特此写下这篇文章,给想入这行的新手们一些参考

1.写项目之前首先我们要确定需求,明确项目需要实现哪些功能(吐槽下:好多项目的大部分功能都是一样的)

2,美工,后台啥的我都直不一一说了情况都不一样

废话不说了直接开写程序
很重要(1)首先我们要确定明确开发需要的框架,一个好的框架可以让我们轻松很多

框架可以自己写,也可以从网上找,多对比一下会有惊喜的
页面
(1)一般每个详情页面都有相应的导航栏;如果有直接参考(见导航Deno,直接输入图片网址或者本地图片,设置坐标一键搞定);如果没有直接跳过
(2)然后就到了图文布局了:(推荐xib或storyboard)强大快速(尤其项目比较急的时候更是不二选择);不熟练的话那就老实的算坐标,布局吧!这个情况太多,一般难度也不大,费点心基本都可以搞定(我在这里就不详细说了。)
我这里就按功能说了(不需要就直接跳过)
功能
搜索
第一种搜索:
UISearchBar 遵守协议
//将要进入编辑模式调用

  • (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
    //显示cancel 按钮
    [searchBar setShowsCancelButton:YES animated:YES];
    return YES;

}
//将要退出编辑模式调用

  • (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
    请把代码粘贴在这里
//隐藏cancel 按钮
[searchBar setShowsCancelButton:NO animated:YES];
return YES;

}

// 点击 搜索按钮的时候调用

  • (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    //写入搜索内容(根据需要进行搜索)

}
//点击cancel 被调用

  • (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    //清空内容
    searchBar.text = @"";
    [searchBar resignFirstResponder];//收键盘

}
第二种搜索
iOS8新出的感觉很强大,大家以后尽量都用它吧,紧跟版本呀!
UISearchController :它的其中一个属性就是searchBar
需要先设置它的搜索结果视图
//nil为和当前视图总用一个视图
self.searchVC = [[UISearchController alloc] initWithSearchResultsController:nil];
//如果不需要刻意再创建一个如:
UITableViewController *tableVC = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];

tableVC.tableView.delegate = self;
tableVC.tableView.dataSource = self;
[tableVC.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

self.searchVC = [[UISearchController alloc] initWithSearchResultsController:tableVC];

注意需要两个协议
//搜索协议
delegate
//更新搜索内容的代理
searchResultsUpdater
//必须要加上 自适应才能显示 搜索条
[self.searchVC.searchBar sizeToFit];
UISearchResultsUpdating 协议

  • (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    NSLog(@"searchBar 更新内容");
    //搜索内容
    //检索推荐谓词检索,快准狠有没有!详细的去百度吧度娘威武!

    //最后搜索数据源变了 ->让搜索控制器 内部的结果视图控制器的tableView的刷新
    UITableViewController tableVC = (UITableViewController )searchController.searchResultsController;
    [tableVC.tableView reloadData];
    }

  • (void)willPresentSearchController:(UISearchController *)searchController {
    NSLog(@"searchController 将要 显示");

}

  • (void)didPresentSearchController:(UISearchController *)searchController {
    NSLog(@"searchController 已经 显示");
    }
  • (void)willDismissSearchController:(UISearchController *)searchController {
    NSLog(@"searchController 将要 消失");
    }

  • (void)didDismissSearchController:(UISearchController )searchController {
    NSLog(@"searchController 已经 消失");
    }
    !!如果需要页面跳转
    在进行页面跳转的时候要注意现在有两个视图呀需要区分开
    UIViewController
    vc = nil;
    //self.presentedViewController获取已经模态跳转上册的视图控制器,如果dismiss 之后 这个值会变成nil
    if (self.presentedViewController) {

      //判断一下 当前视图控制器有没有 模态跳转 的视图,如果有 那么 做另外一个模态跳转的时候 应该用 上一个已经模态跳转的控制器进行 模态跳转下一个
      vc = self.presentedViewController;

    }else {

      vc = self;

    }
    //模态跳转
    [vc presentViewController:alert animated:YES completion:nil];

下载
首先判断是否已经下载过,然后告知服务器从哪里下载,
(1)下载前需要先确定路径
获取文件在沙盒中Documents下的全路径
//我们把url作为文件名字-》但是url 中可能存在一些非法字符不能作为文件名,这时我们可以用md5 对文件名进行加密 产生一个唯一的字符串 (十六进制的数字+A-F表示),这样就可以保证文件名不出现非法字符
NSString fileName = [url MD5Hash];//MD5
//获取Documents
NSString
docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//拼接路径
NSString filePath = [docPath stringByAppendingPathComponent:fileName];
NSLog(@"path:%@",filePath);
*这里需要用到OC文件管理的知识!
//创建文件(首先检测有没有存在,如果没有在创建)
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
//检测文件是否存在
//不存在那么要创建
//NSFileManager 文件管理句柄
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
}
//如果已存在获取已近下载的大小,如果不存在那么大小为0;
NSDictionary
fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
//保存已经下载文件的大小
self.loadedFileSize = fileSize;
//下载前需要打开文件
self.fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
*(如果服务器支持可变断点续传可以照用,如果不支持请忽略 头域)
//把文件大小告知服务器
//创建可变请求 增加请求头
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
//增加头域 告知服务器 从 哪个字节之后开始下载(不了解头域的还是那句话百度),不支持头域的可以直接跳过
[request addValue:[NSString stringWithFormat:@"bytes=%llu-",fileSize] forHTTPHeaderField:@"Range"];
//创建请求连接 开始异步下载
_httpRequest = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSURLConnectionDataDelegate
//接收服务器响应

  • (void)connection:(NSURLConnection )connection didReceiveResponse:(NSURLResponse )response {
    在这里我们可以计算文件的总大小,获取数据的类型 : httpResponse.MIMEType ,数据的大小: NSHTTPURLResponse httpResponse = (NSHTTPURLResponse )response
    NSLog(@"url:%@",httpResponse.URL.absoluteString);
    //计算文件总大小 = 已经下载的+服务器将要发的
    ( self.loadedFileSize和上面关联着 数据是一段一段下载的)
    self.totalFileSize = self.loadedFileSize+httpResponse.expectedContentLength;
    }
    //接收数据过程 一段一段接收
  • (void)connection:(NSURLConnection )connection didReceiveData:(NSData )data {
    //都是OC文件管理的知识,我就不细说了吧
    //下载一段 写一段数据
    //先把文件偏移量定位到文件尾
    [_fileHandle seekToEndOfFile];
    //写文件
    [_fileHandle writeData:data];
    //立即同步到磁盘
    [_fileHandle synchronizeFile];
    //记录已经下载数据大小
    self.loadedFileSize += data.length
    }
    //下载完成一定要关闭呀
  • (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self stopDownload];//停止下载
    }
    //下载失败也要关闭呀
  • (void)connection:(NSURLConnection )connection didFailWithError:(NSError )error {
    [self stopDownload];
    }
  • (void)stopDownload {
    if (_httpRequest) {
      [_httpRequest cancel];
      _httpRequest = nil;
    }
    [_fileHandle closeFile];//关闭文件
    }
    收藏(关注)
    这和数据库有关联(数据库下面我会说的,不懂得也可以先看后面的数据库)
    点击收藏按钮的时候相当于在数据库里面增加了一条数据
    和关注按钮基本一样,有时候只是表现形似不同罢了本质都是一样
    这里我用的是DBManager
    //关于数据库的方法,自己写的,就是这里面记录的都是收藏过得数据
    //获取所有的收藏过得数据,放在数组里
    self.favoriteArr = [[DBManager sharedManager]fetchall];
    然后遍历数组获取相关图片的的URL下载图片
    for (int i = 0; i<_self.favoriteArr.count; i++) {
    AppModel model = _favoriteArr;
    //我这里建个button 来显示收藏(具体问题具体分析说白了就是把你收藏的东西展现出来)图片下载用的是SDimage第三方库
    UIButton
    btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn sd_setImageWithURL:[NSURL URLWithString:model.iconUrl] forState:UIControlStateNormal placeholderImage:[UIImage imageNamed: @"account_candou"]];



    }
    登录和注册(每个App必备的功能)

分为 ,自身登录注册(自己起的名字知道大概意思就行了哈,别在意哈) 和 第三方登录(微博,QQ,微信,等外国的不常用,基本就是那几个社交的,忘了还有人人(话说没多少人用了吧),第三方遵循的基本原则:那个人多就用那个)
主要说下自身登录
注册
大多数登录和注册都用的是post请求{这里需要我们和做服务器的协调好,登陆成功,登录失败返回什么
我们根据这些来提示用户是否登陆成功,!
如果用户登录成功我们需要记录用户登录成功这个状态,以防止用户多次登录,重复登录
这时我们需要定义一个全局变量
在登录成功后记录登录状态

extern:引入外部变量
extern BOOL isLogin;
isLogin=YES;

在其他页面再需要登录的先判断登录状态,如果为YES就不需要在登陆了,如果没有提示用户需要登录后才可以进入
}
第三方登录直接到开放平台下demo;

清除缓存

这里我用的SDimage库的

import "UIImageView+WebCache.h"

-(double)getCachesSize
{
//SDimage缓存
NSInteger sdfileSize=[[SDImageCache sharedImageCache]getSize]; NSStringcaches=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
NSString
mycacehs=[caches stringByAppendingPathComponent:@"MyCaches"];
NSDirectoryEnumeratorenumor=[[NSFileManager defaultManager]enumeratorAtPath:mycacehs];
NSUInteger mysize=0;
for (NSString
filename in enumor) {
NSStringfilepath=[mycacehs stringByAppendingPathComponent:filename];
NSDictionary
filedict=[[NSFileManager defaultManager]attributesOfItemAtPath:filepath error:nil];
//自身缓存
mysize+=filedict.fileSize;
}
return (mysize+sdfileSize)/1024.0/1024.0;
}
分享
:(系

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值