第一篇在上的文章,以前都是写在博客上,但是也得跟上时代的步伐不是..虽然有点晚 -.-
1.在searchBar上的UIText中字符串不能及时获取问题,只需要把获取的string转换成可变字符串就可以
NSMutableString*newtxt = [NSMutableStringstringWithString:textField.text];
[newtxtreplaceCharactersInRange:rangewithString:string];
2.Tableview不识别touchesBegan方法
UITableView是不会响应touchesBegan:withEvent:之类的UIResponder的方法的。因此,加在其上的所有视图的响应者链就断了。如果在UITableView其上加任何的自身不具备类似UIButton一样有目标动作机制的UIView及其子类控件的时候,这个控件也不会响应touchesBegan:withEvent:方法。即便是设置该控件的userInteractionEnabled为YES也没用。
如此一来,如果想要这些控件具有交互性能怎么办?有一种很直观的方法,给这个控件加上手势识别器。
- (void)addAGesutreRecognizerForYourView
{
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesturedDetected:)]; // 手势类型随你喜欢。
tapGesture.delegate = self;[yourView addGestureRecognizer:panGesture];
}
- (void)tapGesturedDetected:(UITapGestureRecognizer *)recognizer
{
// do something
}
3.SDWebImage的三级缓存,大量图片是否造成APP crash
首先检查了SDWebImage代码中对于memory warning的处理:
- (void)clearMemory {
[self.memCache removeAllObjects];
}
其中self.memCache是NSCache类型的,可以看到SDWebImage本身对内存警告执行了操作,但是并没有什么X用。
可以看到内存基本都在decodedImageWithImage:这个方法里被占用了
在使用SDWebImage加载较多图片造成内存警告时,定期调用
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
可解决。
4.Didload里面直接show一个UIAlertController 会显示不出来
刚步入iOS开发会遇到这个问题,警告是 viewcontroll没有被加载
非常典型的一个生命周期问题,把show UIAlertController 这个操作放在ViewDidApear中,等待当前视图控制器加载完了之后再调用UIAlertController控制器,这样的话就可以调用了.
5.模态界面的直接返回父视图的根视图
self.presentingViewController.view.alpha=0;
[self.presentingViewController.presentingViewControllerdismissViewControllerAnimated:YEScompletion:nil];
6.解决cell分割线缺失一段
-(void)viewDidLayoutSubviews {
if([self.tableViewrespondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableViewsetSeparatorInset:UIEdgeInsetsZero];
}
if([self.tableViewrespondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableViewsetLayoutMargins:UIEdgeInsetsZero];
}
}
-(void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPat{
if([cellrespondsToSelector:@selector(setLayoutMargins:)]) {
[cellsetLayoutMargins:UIEdgeInsetsZero];
}
if([cellrespondsToSelector:@selector(setSeparatorInset:)]){
[cellsetSeparatorInset:UIEdgeInsetsZero];
}
7.在模态界面添加timer
主线程,运行时Runloop机制问题,响应者链找不到当前视图控制器的Runloop,需要添加一个线程,把timer放在这个线程的RunLoop中,注意释放.在请求中添加timer会阻塞请求线程,整个APP线程会崩溃
dispatch_async(dispatch_get_global_queue(0,0), ^{
NSTimer*t = [NSTimerscheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(configureTimerr:)
userInfo:@{@"strTime":strTime,@"endTime":endTime}
repeats:YES];
[[NSRunLoopcurrentRunLoop]addTimer:tforMode:NSDefaultRunLoopMode];
[[NSRunLoopcurrentRunLoop]run];
});
8.init里边初始controller.注册通知.通知无效
通知的结果操作view,还没调用load view,view为nil
9.防止用户多次点击按钮弹窗重复
@synchronized(self){
if (self.view.userInteractionEnabled == NO)
return;
}
self.view.userInteractionEnabled = NO; //防止用户多次点击按钮弹窗重复
10.performSeletor...afterDelay在子线程不能使用
performSeletor...afterDelay这个函数一定要在主线程用,在子线程使用不延迟
11.判断是否有自定义键盘
自定义键盘和第三方键盘的class不一样
NSArray*array = [UITextInputModeactiveInputModes];//获取键盘类型个数
if([[[UIDevicecurrentDevice]systemVersion]floatValue] >=9.0) {
//系统大于9.0的时候,在系统键盘上多了一层layer层可修改
temp = [[[UIApplicationsharedApplication]windows]objectAtIndex:2];
}else{
//系统不大于9.0时候,在系统键盘上没有那一层
temp = [[[UIApplicationsharedApplication]windows]objectAtIndex:1];
}
[tempaddSubview:_dianBT];
12.[UIScreen mainScreen].bounds.size.width值不改变问题
在LaunchImage中必须有Default.png和Default-568h.png文件,如果iOS 检测不到这两个文件就不会根据屏幕尺寸适配
13.tableview和collection view中的手势冲突问题
//- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
// DLog(@"1");
// if ([touch.view isKindOfClass:[UITextField class]])
// {
// return NO;
// }
// //若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
// if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
// return YES;
// }
// return YES;
//}
14.百度地图-雷达搜索坑点
(1) 第一次检索的时候是以当前用户的位置为中心进行检索(默认)
(2) 上传第一次的位置信息是检索不出来的,因为是以最后上传的位置为中心检索
(3) 第二次上传信息之后,可以检索到第一次上传的信息,因为是以第二次上传的位置为中心进行检索,可以检索到第一次的位置信息,但是返回的数组中没有当前上传的信息.
总结:总归当前上传的是查不出来的,因为是默认为中心点的.不上传的话是默认为当前位置
(4) 百度官方中Demo设置雷达的时候,中心点的坐标获取是一个监听,要是用户不移动的话获取不到用户位置,也就获取不到数据(BUG)
(5) 百度周边雷达上传自己位置的时候,上传的备注信息中不能有”/“符号(可能还有其他限制,暂时就知道不能上传”/“),倒是可以上传”-"这个符号
这段代码!!!!
[_mapview showAnnotations:@[_annotation] animated:NO];
会自动把视角移动到这几个标记点上
15.push几种跳转问题(个人认为比较不容易出问题的方式)
(1) [self.tabBarController.tabBarsetTranslucent:NO]; (在用storyboard时隐藏tabbar)
(2) yourVC.hidesBottomBarWhenPushed=YES;(在用XIB时隐藏tabbar)
(3) self.hidesBottomBarWhenPushed=YES;(没有XIB时隐藏tabbar)
16.获取父视图控制器
- (UIViewController*)viewController
{
for(UIView* next = [selfsuperview]; next; next = next.superview) {
UIResponder*nextResponder = [nextnextResponder];
if([nextResponderisKindOfClass:[UIViewControllerclass]]) {
return(UIViewController*)nextResponder;
}
}
returnnil;
}