iOS开发 爱特开发技术bug总结
#pragma mark 每天总结学习两小时 效率 和 每天学习 研究底层 多进去看看
// ..........................................................................................//
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| -_- |) //
// O\ = /O //
// ____/`---'\____ //
// . ' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . __ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ======`-.____`-.___\_____/___.-`____.-'====== //
// `=---=' //
// //
//..........................................................................................//
// 道家张三丰 //
http://life.httpcn.com/mobile.asp#main
http://blog.csdn.net/qq_30513483/article/details/50913120 多种常用封装
NSLog(@"%@",NSStringFromCGRect(self.tableView.frame)); 打印frame
#pragma mark 录音播放完成 的代理方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
<!--<添加调用的方法>-->
_playBtn.tag = 0;
[_playBtn setImage:[UIImage imageNamed:@"kai1"] forState:UIControlStateNormal];
}
#pragma mark 加载广告 的一些问题 AFN 异步下载 但请求是个block 所以要把下载线程放在 同一个网络进程里 否则获取不到 广告的URL 因为下载是异步 ,所以要把异步放在block 内
//这一步是获取上次网络请求下来的图片,如果存在就展示该图片,如果不存在就展示本地保存的名为test的图片
NSMutableData * data = [[NSUserDefaults standardUserDefaults]objectForKey:@"imageu"];
if (data.length>0) {
_Imageview.image = [UIImage imageWithData:data];
}else{
_Imageview.image = [UIImage imageNamed:@"028"];
}
//下面这段代码,是调用AFN下载文件的方法,异步
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
// 请求是个block 所以要把下载线程放在 同一个网络进程里 否则获取不到 广告的URL 因为下载是异步
AVQuery* query = [AVQuery queryWithClassName:@"ADguanggao"];
[query orderByAscending:@"order"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error==NULL && objects!= NULL && objects.count > 0) {
AVFile *file = [objects[0] objectForKey:@"AD"];
self.ADURL = file.url?file.url:@"";
NSLog(@"广告的url%@",self.ADURL);
// 图片赋值
// [self.Imageview sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",self.ADURL]] placeholderImage:[UIImage imageNamed:@"01"]];
NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@",self.ADURL]];
NSLog(@"加载下载的%@",URL);
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
NSData * image = [NSData dataWithContentsOfURL:filePath];
[[NSUserDefaults standardUserDefaults]setObject:image forKey:@"imageu"];
}];
[downloadTask resume];
}
}];
#pragma mark 设置tableBar 的字体 字体大小 颜色 背景图片
self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:0 green:0.2 blue:0.4 alpha:1];
NSDictionary *dic = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:18.f], NSForegroundColorAttributeName:[UIColor blackColor]};
self.navigationController.navigationBar.titleTextAttributes = dic;
#define APP_FONT @"YouYuan" 下载字体 YouYuan.TTF
_title.font = [UIFont fontWithName:APP_FONT size:15];
_title.textColor = [UIColor colorWithHexString:@"#171717"];
#pragma mark 广告页 下载缓存 实现 和 简约引导页的加载
_Imageview= [[UIImageView alloc]initWithFrame:[UIScreen mainScreen].bounds];
_Imageview.userInteractionEnabled = YES;
UITapGestureRecognizer *singleTap =[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(UesrClicked)];
[_Imageview addGestureRecognizer:singleTap];
[self.view addSubview:_Imageview];
_Imageview.tag = 2;
//这一步是获取上次网络请求下来的图片,如果存在就展示该图片,如果不存在就展示本地保存的名为test的图片
NSMutableData * data = [[NSUserDefaults standardUserDefaults]objectForKey:@"imageu"];
if (data.length>0) {
_Imageview.image = [UIImage imageWithData:data];
}else{
_Imageview.image = [UIImage imageNamed:@"028"];
}
//下面这段代码,是调用AFN下载文件的方法,异步
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://ac-uRSvH8Hw.clouddn.com/e8e238eaa4b1041c.png"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
NSData * image = [NSData dataWithContentsOfURL:filePath];
[[NSUserDefaults standardUserDefaults]setObject:image forKey:@"imageu"];
}];
[downloadTask resume];
#pragma mark 不是控制器 跳转的方法
添加一个方法
- (UIViewController *)viewController:(UIView *)view{
UIResponder *responder = view;
while ((responder = [responder nextResponder]))
if ([responder isKindOfClass: [UIViewController class]])
return (UIViewController *)responder;
return nil;
}
<!-- 然后self.VC.navigationController push pop present 你乐意想跳那去哪-->
}else{
LoginVC *LogVC = [[LoginVC alloc]init];
[self.VC.navigationController pushViewController:LogVC animated:YES];
}
#pragma mark dispatch_get_main_queue 和定时器 NSTimer 的使用 区别
问题:主页设置根视图时 用了
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
HTabBarController *tab = [[HTabBarController alloc] init];
HNavigationController *nv = [[HNavigationController alloc] initWithRootViewController:tab];
window.rootViewController = nv;
});
导致5秒后 自动调回 虽然跳到广告图 时间到后直接返回 产生崩溃
- (void)UesrClicked{
[self.timer invalidate];
// 点击多次广告业 只响应最后一次
AVQuery* query = [AVQuery queryWithClassName:@"ADguanggao"];
[query orderByAscending:@"order"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (![self.navigationController.childViewControllers.lastObject isKindOfClass:[HWebView class]]) {
NSString *bannerurl = [objects[0] objectForKey:@"AD_url"];
HWebView *webView = [[HWebView alloc] initWithURLString:bannerurl];
self.window = [UIApplication sharedApplication].keyWindow;
HTabBarController *tab = [[HTabBarController alloc] init];
HNavigationController *nv = [[HNavigationController alloc] initWithRootViewController:tab];
self.window.rootViewController = nv;
NSLog(@"%@",self.window);
[nv pushViewController:webView animated:YES];
NSLog(@"点击了广告%@",bannerurl);
}
}];
}
解决方案: 添加一个定时器
@property (strong,nonatomic)NSTimer *timer;
在viewDidLoad 直接回调 在点击广告的imageView方法里 [self.timer invalidate]; 取消定时器
self.timer = [NSTimer scheduledTimerWithTimeInterval:6.0 target:self selector:@selector(UserNOClick) userInfo:nil repeats:NO];
#pragma mark 加载cell 显示 从第一个 开始 scrollToItemAtIndexPath
[collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:NO];
indexPathForRow 的 inSection 第几个cell 的第几个
<!--UICollectionViewScrollPositionNone = 0,-->
<!--UICollectionViewScrollPositionTop = 1 << 0,-->
<!--UICollectionViewScrollPositionCenteredVertically = 1 << 1,-->
<!--UICollectionViewScrollPositionBottom = 1 << 2,-->
<!---->
<!--UICollectionViewScrollPositionLeft = 1 << 3,-->
<!--UICollectionViewScrollPositionCenteredHorizontally = 1 << 4,-->
<!--UICollectionViewScrollPositionRight = 1 << 5-->
#pragma mark 不同的设置颜色 线宽 切割
// self.backgroundColor = [UIColor colorWithHexString:@"#EEEEEE"];
self.isPlay = NO;
// self.layer.borderColor = [UIColor grayColor].CGColor;
// self.layer.borderWidth = 0.3f;
self.contentView.clipsToBounds = YES;
self.layer.cornerRadius= 5.0f;
[self. recordView.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
#pragma mark po
在调试阶段这个命令非常有用。通常情况下,为了打印变量的值,我们需要移动鼠标指针并点击和选择打印描述打印值。有时候这种做法对编程并不友好,而po命令让这个过程变得简单且迅速 ,看一个示例。
在该示例中,我已经创建了一个命名为str的字符串,并为其赋值。现在要在不移动光标的情况下打印该值,我现在仅需要在输出窗口编写"po variable name"并摁下Enter键。
内存泄漏隐患提示:
Potential Leak of an object allocated on line ……
数据赋值隐患提示:
The left operand of …… is a garbage value;
对象引用隐患提示:
Reference-Counted object is used after it is released;
#pragma mark// RGB 还可以这样 直接写小数
self.view.backgroundColor = [UIColor colorWithRed:0.92 green:0.75 blue:0.41 alpha:1];
#pragma mark 封装 代理 调用
#pragma mark 在自定义view 中进行页面跳转
首先 定义一个全局变量 UIViewController *superVC;
//然后执行这个方法
- (UIViewController *)viewController:(UIView *)view{
UIResponder *responder = view;
while ((responder = [responder nextResponder]))
if ([responder isKindOfClass: [UIViewController class]])
return (UIViewController *)responder;
return nil;
}
最后,在你跳转页面的方法中
superVC = [self viewController:self];
[superVC.navigationController pushViewController:(UIViewController) animated:YES];
这样就可以跳转页面了
#pragma mark 开发中按钮 放大按钮的热区
//放大按钮的热区
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
CGRect bounds = self.bounds;
//若原热区小于44x44,则放大热区,否则保持原大小不变
CGFloat widthDelta = MAX(44.0 - bounds.size.width, 0);
CGFloat heightDelta = MAX(44.0 - bounds.size.height, 0);
bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
return CGRectContainsPoint(bounds, point);
}
#pragma mark cell中 状态的记录和取消 1
@property (nonatomic,strong)HMImageCell *oldCell;
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
HMImageCell *cell = (HMImageCell *)[collectionView cellForItemAtIndexPath:indexPath];
// if (indexPath.row ==0) {
cell.imageView.layer.borderColor = [[UIColor orangeColor]CGColor];
cell.imageView.layer.borderWidth =2.0f;
if (_oldCell) {
_oldCell.imageView.layer.borderWidth = 0.0f;
}
_oldCell = cell;
}
#pragma mark cell中 状态的记录和取消 2
@property (nonatomic,strong) ListenCell *oldCell; // 记录上一个cell 的 状态
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
ListenCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
cell.delegate = self;
if (_selectIndexPath) {
// 防止cell 重用 需要找到条件
if (indexPath.row == _selectIndexPath.row ) {
cell.play.tag =1;
[cell startAnimation];
[cell runStar];
_oldCell = cell;
}else{
// 取消 赋值tag 可以 修改状态
// cell.play.tag = 0;
[cell stopAnimation];
[cell runstop];
}
}
cell.data = self.dataSoure[indexPath.row];
return cell;
}
#pragma ListenCellDelegate
// 上一个cell 停止播放动画 和 旋转 oldcell = cell 在赋值过去
- (void)cellStopAnimationwithCell:(id)cell{
if (_oldCell) {
[_oldCell stopAnimation];
[_oldCell runstop];
[_oldCell.play setImage:[UIImage imageNamed:@"kai1"] forState:UIControlStateNormal];
}
[cell startAnimation];
[cell runStar];
_oldCell = cell;
NSIndexPath *path = [_collectionView indexPathForCell:cell];
_selectIndexPath = path;
}
// 防止cell 的重用 需要制nil
- (void)cellStopAnimation{
_selectIndexPath = nil;
_oldCell = nil;
}
#pragma mark ActionSheetStringPicker 的使用
// NSArray *timels = [NSArray arrayWithObjects:@"男", @"女", nil];
//
// [ActionSheetStringPicker showPickerWithTitle:@"性别选择"
// rows:timels
// initialSelection:0
// doneBlock:^(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue) {
//
// // 选择以后做的事
// NSLog(@"Picker: %@, Index: %ld, value: %@",
// picker, (long)selectedIndex, selectedValue);
//
// if (selectedIndex ==0) {
//
// _UserdSex.text = @"男";
// }else if (selectedIndex == 1){
// _UserdSex.text = @"女";
//
// }else{
//
//
//
// }
//
// }
// cancelBlock:^(ActionSheetStringPicker *picker) {
// // 取消以后做的事
// NSLog(@"Block Picker Canceled");
// }
// origin:self.view];
#pragma mark 截取字符串 第一个是坐标 第二个是位数
_UserdPhone.text = [NSString stringWithFormat:@"%@****%@",[[AVUser currentUser].mobilePhoneNumber substringWithRange:NSMakeRange(0, 3)],[[AVUser currentUser].username substringWithRange:NSMakeRange(7,4)]];
#pragma mark UITextField 添加边框颜色
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
textField.layer.cornerRadius=8.0f;
textField.layer.masksToBounds=YES;
textField.layer.borderColor=[[UIColor orangeColor]CGColor];
textField.layer.borderWidth= 1.0f;
return YES;
}
#pragma mark navigationItem.rightBarButtonItem 添加导航条右侧按钮
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"锁" style:UIBarButtonItemStylePlain target:self action:@selector(clickLock)];
self.tabBarController.navigationItem.rightBarButtonItem = item;
#pragma mark 抓包工具 charles
打开Charles 电脑手机 同一个网络
同一个 IP 抓取APP的json 挑选 判断比较删除多余url数据
#pragma mark 今日头条json (失效)
1,今日 头条 http://toutiao.com/api/article/recent/?source=2&count=20&category=%E7%AB%A5%E4%B9%A6%E7%BB%98%E6%9C%AC&offset=0
#pragma mark 如何在一行Textfile 显示 图片
如何在一行显示 图片 textfile 外面包含图片 .leftView .rightView
#pragma mark 添加占位图片的方法
SDCycleScrollView *banner = [SDCycleScrollView cycleScrollViewWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, kBannerHeight) imageURLStringsGroup:arrM];
banner.placeholderImage = [UIImage imageNamed:@"head.jpg"];
#pragma mark leancloud 存储 请求
AVQuery* query = [AVQuery queryWithClassName:AT_BANNER];
[query orderByAscending:@"order"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error==NULL && objects!= NULL && objects.count > 0)
AVQuery* query = [AVQuery queryWithClassName:AT_BANNER];
[query orderByAscending:@"order"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSString *bannerurl = [objects[index] objectForKey:@"Banner_URL"];
HWebView *webView = [[HWebView alloc] initWithURLString:bannerurl];
[self.tabBarController.navigationController pushViewController:webView animated:YES];
#pragma mark 提示框 Alert不设置代理添加点击事件 UIAlertController
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"是否保存图片" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// [self.navigationController popViewControllerAnimated:YES];
// self.navigationController pushViewController: animated:<#(BOOL)#>
// [self clickButton10];
[self.navigationController popViewControllerAnimated:YES];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self.navigationController popViewControllerAnimated:YES];
}];
[alertController addAction:sureAction];
[alertController addAction:cancelAction];
[self.parentViewController presentViewController:alertController animated:YES completion:^{
}];
#pragma mark 跳转控制器
//storyBoard 跳转的方法 记得写 storyboard ID !!!
UIStoryboard * storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
[self.navigationController pushViewController:[storyBoard instantiateInitialViewController] animated:YES];
UIStoryboard * storyBoard = [UIStoryboard storyboardWithName:@"PaintVC" bundle:nil];
[self.navigationController pushViewController:[storyBoard instantiateInitialViewController] animated:YES];
LoginVC *loVC = [[LoginVC alloc]init];
[self.navigationController pushViewController:loVC animated:YES];
HWebView *webView = [[HWebView alloc] initWithURLString:data.display_url];
[self.tabBarController.navigationController pushViewController:webView animated:YES];
CourseVC *vc = [[CourseVC alloc] init];
[self.tabBarController.navigationController pushViewController:vc animated:YES];
返回上一个控制器
[self.navigationController popViewControllerAnimated:YES];
返回根控制器
[self.navigationController popToRootViewControllerAnimated:NO];
#pragma mark 排序的升序 与 降序
[query orderByAscending:@"order"]; 升序
- (void)orderByDescending:(NSString *)key; 降序
#pragma mark 如何找你需要的功能 !!!!!!!
UIImage Scanline Floodfill
谷歌英文翻译 然后github 上搜索
#pragma mark 所谓的适配 不要写死 依据屏幕长宽或者长宽比
#define fDeviceWidth ([UIScreen mainScreen].bounds.size.width)
#define fDeviceHeight ([UIScreen mainScreen].bounds.size.height)
#define kItemWidthHeigthScale 1.2 //长宽比
#pragma mark 判断手机是5s 还是 6s 的方法 可用于约束 缩放比
6s:
<UIScreen: 0x7fba3ae15180; bounds = {{0, 0}, {375, 667}}; mode = <UIScreenMode: 0x7fba3ae15710; size = 750.000000 x 1334.000000>>
5s:
<UIScreen: 0x7f8de0c0b5f0; bounds = {{0, 0}, {320, 568}}; mode = <UIScreenMode: 0x7f8de0c0d0a0; size = 640.000000 x 1136.000000>>
例子:
if ([UIScreen mainScreen].bounds.size.width== 320) {
_paintingView = [[PaintingView alloc]initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height*(0.58))];
}else{
_paintingView = [[PaintingView alloc]initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height*(0.62))];
}
#pragma mark @synthesize 指令
告诉编译器在编译期间 产生getter/setter 方法
#pragma mark tableView的加载和colloectionView的加载的区别 横屏竖屏
创建多种重复视图建议使用collectionView
共同拥有的属性和方法 可以写在 cell 里
单图cell 的工具
#pragma mark UIimage 默认的userlnteraction 是NO!!!!!
UIImageview 默认的userInteractionEnabled是NO;
UIView的userInteractionEnabled默认是YES。
#pragma mark 在UITableView上添加了UITapGestureRecognizer后会导致didSelectRowAtIndexPath失效
在UITableView上添加了UITapGestureRecognizer后会导致didSelectRowAtIndexPath失效,原因是UITapGestureRecognizer会截取了tableView的touch事件,导致无法响应行选择,解决方法是重写UIGestureRecognizerDelegate中的
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {//如果当前是tableView
//做自己想做的事
return NO;
}
return YES;
}
#pragma mark 控制器之间的传值 方法 代理 KVO Block 顺传 逆传
代理方法: A控制器显示 B控制器的数据 A控制器需要加载不同的数据源方法 当B控制器加载进来的时候(点击B控制器Cell的时候或方法时)
需要:在B的cell .h中 添加代理 或方法 ,m 添加A的头文件 点击方法里遵守代理
NSIndexPath * indexP = indexPath;
self.delegate.bookIndexPath = indexP;
A控制器 .m 导入B控制器的 头文件
A 的加载cell的方法里 添加不同的数据源
HImageListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
if (self.VC.bookIndexPath.item == YINGHUOQIBING1) {
NSString *imgStr = [NSString stringWithFormat:@"yinghuo%zd.jpg", indexPath.row+1];
cell.imageView.hidden = NO;
cell.imageView.image = [UIImage imageNamed:imgStr];
cell.imgStr = imgStr;
}
if (self.VC.bookIndexPath.item == YINGHUOQIBING2) {
cell.imageView.hidden = NO;
NSString *imgStr = [NSString stringWithFormat:@"yinghuo2%zd.jpg", indexPath.row+1];
cell.imageView.image = [UIImage imageNamed:imgStr];
cell.imgStr = imgStr;
}
DLog(@"testest");
return cell;
#pragma mark collectionView 多种cell 的嵌套
(1)两种cell控制器的选择 传值
1。加载cell
BookCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:celllD forIndexPath:indexPath];
if (self.selectType == 1) {
if (indexPath.row == 0) {
cell.imageView.image = [UIImage imageNamed:@"Book"]
;
// cell.userName.text = @"AR";
}else if (indexPath.row == 1){
cell.imageView.image = [UIImage imageNamed:@"Book1"];
// cell.userName.text = @"秘密花园";
} else if (indexPath.row == 2){
cell.imageView.image = [UIImage imageNamed:@"Book1"];
// cell.userName.text = @"植物";
}else if (indexPath.row == 3){
cell.imageView.image = [UIImage imageNamed:@"Book"];
// cell.userName.text = @"动物";
}else if (indexPath.row == 4){
cell.imageView.image = [UIImage imageNamed:@"Book"];
// cell.userName.text = @"建筑";
}else{
cell.imageView.image = [UIImage imageNamed:@"Book1"];
// cell.userName.text = @"自由创作";
}
}
return cell;
1.1 跳转方法
NSIndexPath * indexP = indexPath;
self.delegate.bookIndexPath = indexP;
if (indexPath.row == 1){
[self.navigationController popViewControllerAnimated:YES];
}else{
[self.navigationController popViewControllerAnimated:YES];
}
1.2 其他写法
- (void)setSelectType:(NSInteger)selectType{
if (_selectType == selectType) {
return;
}
_selectType = selectType;
[self.collectionView reloadData];
}
- (void)clickHeadButton:(id)sender{
self.selectType = [sender tag];
}
在ViewDidload self.selectType = 1;
2.1 当1跳转过来 根据1 加载不同2的数据源方法
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
HImageListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
if (self.VC.bookIndexPath.item == YINGHUOQIBING1) {
NSString *imgStr = [NSString stringWithFormat:@"yinghuo%zd.jpg", indexPath.row+1];
cell.imageView.hidden = NO;
cell.imageView.image = [UIImage imageNamed:imgStr];
cell.imgStr = imgStr;
}
if (self.VC.bookIndexPath.item == YINGHUOQIBING2) {
cell.imageView.hidden = NO;
NSString *imgStr = [NSString stringWithFormat:@"yinghuo2%zd.jpg", indexPath.row+1];
cell.imageView.image = [UIImage imageNamed:imgStr];
cell.imgStr = imgStr;
}
DLog(@"testest");
return cell;
}
二(复杂), 三种cell的加载选择 传值 判断
2.1加载Cell
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
CreateCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:celllD forIndexPath:indexPath];
if (self.selectType == 1) {
if (indexPath.row == 0) {
cell.imageView.image = [UIImage imageNamed:@"未标题-1.jpg"]
;
cell.userName.text = @"AR";
}else if (indexPath.row == 1){
cell.imageView.image = [UIImage imageNamed:@"hua03.jpg"];
cell.userName.text = @"秘密花园";
} else if (indexPath.row == 2){
cell.imageView.image = [UIImage imageNamed:@"hua04.jpg"];
cell.userName.text = @"植物";
}else if (indexPath.row == 3){
cell.imageView.image = [UIImage imageNamed:@"hua05.jpg"];
cell.userName.text = @"动物";
}else if (indexPath.row == 4){
cell.imageView.image = [UIImage imageNamed:@"hua03.jpg"];
cell.userName.text = @"建筑";
}else{
cell.imageView.image = [UIImage imageNamed:@"hua01.jpg"];
cell.userName.text = @"自由创作";
}
}
return cell;
}
- (void)setSelectType:(NSInteger)selectType{
if (_selectType == selectType) {
return;
}
_selectType = selectType;
[self.collectionView reloadData];
}
- (void)clickHeadButton:(id)sender{
self.selectType = [sender tag];
}
2.2 跳转
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.row == 5){
[self backPaint];
}else{
CreatView *loVC = [[CreatView alloc]init];
loVC.trailIndex = indexPath.item; // 取巧的方法
loVC.imgs = @[@"", @""]; // 写成数组最好
[self.navigationController pushViewController:loVC animated:YES];
}
}
2.3 的 加载数据源
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
// 传值过去
PaintFullVC *PVC = [[PaintFullVC alloc]init];
HImageListCell *cell = (HImageListCell *)[self collectionView:collectionView cellForItemAtIndexPath:indexPath];
PVC.icon = cell.imageView.image;
[self.navigationController pushViewController:PVC animated:YES];
}
#pragma mark UICollectionViewDataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
NSInteger count;
switch (self.trailIndex) {
case 0:
count = 4;
break;
case 1:
count = 3;
break;
case 2:
count = 3;
case 3:
count =4;
default:
break;
}
return count;
// return self.imgs.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
HImageListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
NSString *imgStr = [NSString stringWithFormat:@"Map0%zd_%zd.jpg", indexPath.row+1, self.trailIndex]; // 取巧的数据源加载方法 //后期需要改为数组
cell.imageView.image = [UIImage imageNamed:imgStr];
DLog(@"testest");
return cell;
}
#pragma mark 出现导航栏部分黑屏原因 是 隐藏了 需要注销
// 出现导航栏部分黑屏原因 是 隐藏了 需要注销
//- (BOOL)prefersStatusBarHidden
//{
// return YES;
//}
#pragma mark cell 被多次点击只显示一次 URL的方法
添加判断 只显示最后一次的方法
if (![self.tabBarController.navigationController.childViewControllers.lastObject isKindOfClass:[HWebView class]])
根据不同的控制器写不同的判断
if(![self.navigationController.childViewControllers.lastObject isKindOfClass:[HWebView class]])
#pragma mark UITextFile 的光标处理方法 UI点击手势识别 UITapGestureRecognizer
//设置一个view,为了使将图片添加到这个view上
在一个View里设置UITapGestureRecognizer 方法
UIView *aView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200)];
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
[aView addGestureRecognizer:tap];
- (void)tapAction:(UITapGestureRecognizer *)tap{
[self.UserName resignFirstResponder];
}
#pragma mark Button 和 Label 设置颜色的方式 不要记混
[_btn setTintColor:[UIColor whiteColor]];
[_Label setTextColor:[UIColor whiteColor]];
#pragma mark 创建出来的View 是不同的原因 _ImageView = [[FloodFillImageView alloc]initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height*(0.62))]; self.view 会遇到的问题 大bug问题 有可能View还没有创建 所以后来创建的地址不一样 导致无法赋值的问题
#pragma mark ImageView和Image 不同 ImageView 默认的交互是关闭的 一定要打开
self.iconView.userInteractionEnabled = YES;
#pragma mark 录音播放不出来的 播放器创建不了
/* audioPlayerDidFinishPlaying:successfully: is called when a sound has finished playing. This method is NOT called if the player is stopped due to an interruption. */
// 需要添加audioPlayerDidFinishPlaying 完成的方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
#pragma mark tableView 去掉多余显示的cell 设置cell的颜色 设置cell右边的箭头
// 设置前 要设置cell的样式 initWithStyle:UITableViewCellStyleValue1
if (cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
cell.textLabel.text = @"monalisa";
}
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.detailTextLabel.text = @"mona";
// 取消cell 右侧的箭头
cell.accessoryType = UITableViewCellAccessoryNone;
// 设置cell 右边字体的颜色
[cell.textLabel setTextColor:[UIColor orangeColor]];
// 设置cell 右边的箭头
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
[self setExtraCellLineHidden:self.tableView];
-(void)setExtraCellLineHidden: (UITableView *)tableView
{
UIView *view = [UIView new];
view.backgroundColor = [UIColor clearColor];
[tableView setTableFooterView:view];
}
#pragma mark // 重写UITableView的方法是分割线从最左侧开始
-(void)viewDidLayoutSubviews {
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPat{
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
#pragma mark 字符串的截取
1,字符串从第n 位开端截取,直到最后 (substringFromIndex:n)(包含第 n 位)
2, 字符串截取到第n位 (substringToIndex: n)(第n 位不算再内)
3,substringWithRange: 专门截取字符串的一块肉
NSMakeRange(4,2)
1.定义一个字符串a, 截取a 的某一个项目组,复制给b, b必须是int型
NSString *a = @"1.2.30";
int b= [[a substringWithRange:NSMakeRange(4,2)] intValue];
NSLog(@"a:%@ \n",a );
NSLog(@"b:%d",b );
Output : 2011-07-05 11:49:08.170 Q[4005:207] a:1.2.30
2011-07-05 11:49:08.172 Q[4005:207] b:30
解析如下:substringWithRange: 专门截取字符串的一块肉
NSMakeRange(4,2) 从第4个字符开端截取,长度为2个字符,(字符串都是从第0个字符开端数的哦~!)
b = [a intValue]; 将 a 转换为 整数型
b = [a floatValue]; 将 a 转换为 小数型
b = [a boolValue]; 将 a 转换为 布尔型(true / false)
b = [a integerValue]; 将 a 转换为 整数型
b = [a longLongValue]; 将 a 转换为 长整型
2。 字符串截取到第n位 (substringToIndex: n)(第n 位不算再内)
- (void)viewDidLoad
{
NSString *a = @"i like long dress";
NSString *b = [a substringToIndex:4];
NSLog(@"\n b: %@",b);
}
2011-07-11 18:12:40.119 Q[6321:207]
b: i li
3。字符串从第n 位开端截取,直到最后 (substringFromIndex:n)(包含第 n 位)
- (void)viewDidLoad
{
NSString *a = @"i like long dress";
NSString *b = [a substringFromIndex:4];
NSLog(@"\n b: %@",b);
}
#pragma mark 找bug 的快捷键
在Xcode 6
1.工程导航器:Command+1
快速浏览代码、图片以及用户界面文件。
2.显示/隐藏导航器面板:Command+0
当你在对屏幕进行截图的时候可能会想要隐藏起与你感兴趣内容的无关的部分。假如你想要使用辅助编辑器或者想要设计用户界面并将其连接到代码的时候,这个快捷键会相当有用。
3.显示/隐藏实用工具面板:Command+Option+0
实用工具面板主要用于编辑用户界面文件时,在你只考虑写代码的时候,就可以隐藏它。
4.在辅助编辑器中打开文件:在项目导航器中选中文件执行Option+左键点击操作。
一个快速打开Assistant Editor的方式--只需要按住Option键并点击你想要在当前编辑框右边打开的文件即可。
Xcode搜索快捷键
当你在敲代码的时候,突然想加个什么功能,或者想修改个什么Bug,当然最快的方法就是用查找啦。无需用滚轮穿越百行代码,只需要使用查找,就可以直接跳到特定的代码段。
5.搜索导航器(Find Navigator,也就是搜索):Command+Shift+F
使用项目搜索可以找到某个变量或方法名的被提到的次数。可以依据实例来匹配,并可忽略大小写字母。另外还可以对查找的变量名进行替换。
6.文件跳转栏:Control+6(键入方法/变量名+Enter跳转)
跳转至当前代码文件中的代码行。如果文件中有上千行代码,你可以通过该快捷操作来缩小查找范围,从而在需要的地方插入代码以添加新的功能。
7.快速打开: Command + Shift + O
喜欢使用键盘但不喜欢使用鼠标的人会大爱这个快捷方式,可以直接跳转到某个方法定义或者指定的代码文件。
8.跳转栏和快速打开搜索输入快捷键
键入第一个字母即可快速切换至某个文件或者找到特定的代码行。比如,在ViewController.Swift文件中,按下Command + Shift + O,然后键入vDL,最先展示的结果是带有
viewDidLoad()名的函数。
键入首字母,以较少输入搜索更多。
9. 程序中(Objective-C或C++编写).h and .m文件间的快速切换: Control + Command + Up Arrow
如果你用Objective-C和C++编写程序,或者使用其他语言编写的开源代码,那你可能需要查找现有的代码。你可以使用“Control + Command + Up Arrow”组合键操作在两个
相关的文件间快速切换,比如Objective-C中的头文件和实现文件。假如你使用Swift编写代码,这就有点不合适了,因为Swift使用单一代码文件。
应用程序编译和清理
在体验新应用之前你必须先运行它,不过有时候Xcode会不大给力,不能很好地运行你的项目,这时候你就需要清除不能运行的项目。
以下快捷键可帮你在代码编写过程中尽可能少地使用鼠标。
10.运行app: Command + R
在编写代码的过程中,我通常会使用该快捷键来自由运行应用程序。尽可能地测试应用程序,这样你可以在早期找到并修复应用中的bug。
11.清除工程: Command + Shift + K
或许有那么一次Xcode运行出现问题,或者应用无法响应,或者出现了意料之外的情况,你首先会想要清除工程并再次运行它。如果这样都还不能解决问题,好吧,关掉Xcode
,重新打开。倘若应用程序无法运行,先看看有没有错误信息提示,你可以发挥作为“Googler”的优势来获得帮助。不过这种做法不易太过频繁,它会降低程序的开发速度。它将移除所有的中间文件,而再造这些文件还要花费时间。
当运行失败时清除Xcode工程
12.构建应用程序: Command + B
检查所写代码以确保其正常工作是你经常要做的事情,编译app工程可让你在编写下一个特性之前确定其是否正常工作。即便Xcode在代码编写后会很快进行检查,但也有所延
迟,或者给出一些不恰当的错误提示。你无需总是运行应用程序,假如仅仅做一些小的改变,那么编译工作可帮你做一个快速检查,这样可以返回添加下一行代码。
编译代码以确保应用程序不存在任何错误问题
文档和帮助
在学习过程中,自助学习非常重要,对于没有浏览过Xcode文档帮助的开发者来说,这些快捷键可帮忙查看相关的代码参考,更好地理解苹果提供的代码,从而开发出性能更健壮的app。
13.文档和参考: Command + Shift + 0 (Zero)
使用Xcode在后台安装文档,并支持离线搜索查看,非常适合外出办公。打开文档和参考,并键入代码中的某个关键字,Xcode文档还提供了一些额外的资源和示例工程。
通过Documentation and Reference指南了解如何使用代码
14. 快速帮助: 在类或者方法名上执行Option + Left-click操作
内联帮助可帮开发者快速学习类或代码片段的用法。在变量、类、或者方法名上执行Option + Left-click操作来获得更多细节信息。假使你点击了弹出视图底部的参考链接,那么就可以方便地跳转到Xcode提供的文档中。你还可以在变量、类或者方法名上执行Option+双击名称操作,从而更方便地跳转至文档。
编写代码时获得快速帮助
iOS开发 爱特开发技术bug总结的更多相关文章
- iOS开发——高级技术精选&底层开发之越狱开发第一篇
底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...
- iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)
简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...
- iOS开发——高级技术精选&底层开发之越狱开发第二篇
底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...
- 《转》iOS音频视频初级开发
代码改变世界 Posts - 73, Articles - 0, Comments - 1539 Cnblogs Dashboard Logout HOME CONTACT GALLERY RSS ...
- 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)
随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
随机推荐
- 怎么查找执行比较慢的sql语句-DBA给的建议
1.使用sql动态视图 如下: b.text,a.total_worker_time,a.total_logical_reads,a.total_elapsed_time,execution_coun ...
- IE11和传统asp.net的兼容问题
有一个后台程序是用传统asp.net webform做的,今天发现用chrome浏览没有问题, 反而用IE就出2个问题了. 原来IE静静地升级到11了 1. url里带上session Id 2.gr ...
- Java内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- 比较Date时间先后
if ([firstDetailSelect compare:secondDetailSelect] == NSOrderedDescending) { [MBProgressHUD showErro ...
- for 穷举、迭代 while循环
1.穷举: 把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. 2.百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,如何在凑够100只鸡的情况下刚好花完100 ...
- CentOS 7 下引导 Windows7 启动
Win7/CentOS7 u盘安装后会覆盖硬盘上已有系统的’引导‘ CentOS7下恢复Win7引导 编辑 # vim /etc/grub.d/40_custom 添加 menuentry 'Wind ...
- Java基础(52):ClassCastException详解(转)
ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这 ...
- demo06
city_data.xml <?xml version="1.0" encoding="utf-8"?> <resources> < ...
- ajax基本用法
ajax能做到无刷新数据交互,给用户体验带来好处的同时也减小了服务器的压力,所以运用ajax能使网站性能更强劲.更吸引用户. 大型网站少不了注册页面,而大多数情况下我们不想让用户有相同的注册ID,所以 ...
- 响应式框架pure--来自雅虎
梦想还是要有 http://www.purecss.org/