iOS 标签

CoreData里UUID的奇怪问题

0x1 今天我在开发AppleWatch应用时发现了一个关于CoreData的极其古怪的问题,特此记录下来 0x2 因为CoreData是支持UUID类型的属性的,所以我在设计某个Model时就用了UUID的属性,但是因为不是连续开发导致我后来把这个属性的类型忘了,以为是String. 于是我在手机端的代码里写了类似这样的代码 let uuid: String = "7BD09D86-8941-4E50-9A42-7240E970FEE7" let predicate = NSPredicate(format: "uuid = %@", argumentArray: [uuid]) //省略CoreData根据predicate获取数据的代码 注意Model里uuid的属性类型是UUID,我在这里直接用的是String 然后,我...很成功的获取到了预期的数据. 当然,我当时并没有意识到类型不匹配. 于是乎,我把相同的代码放到了 //MARK: -WCSession的代理方法 Watch向iPhone发送的消息在这里接收 func session(_ session: WCSessi....

阅读全文 »

回头看之UITableView-(基本代理方法及复用原理)

UITableVIew是iOS开发中最常见的视图中最经典的视图了,没有之一,相信对这个视图敢称精通的人开发个好应用应该是问题不大的。 闲话少叙,进入正题。 怎么使用 掌握两个代理 UITableViewDelegate @optional //下文再提到该方法用heightForRow代替 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; UITableViewDataSource @required //下文再提到该方法用numberOfRowsInSection代替 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; //下文再提到该方法用cellForRow代替 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtInd....

阅读全文 »

回头看UITableView(二)-父视图UIScrollView

题目早早就定下了,现在想填充内容了,踌躇中却不知道从哪里开始了。 窗外突然下起雨来。虽然不愿承认,但夏天确实已经渐去渐远,凉意开始蔓延。索性放空身心,伴着雨声入眠吧。 I'm back! 众所周知,UITableView的父视图就是UIScrollView,UITableView之所以能滚动就是基于UIScrollView的特性,今天咱们就来深入理解一下UIScrollView。 上图: 打码: - (IBAction)boundsAction:(UIStepper *)sender { self.redView.bounds = CGRectMake(0, sender.value, self.redView.bounds.size.width, self.redView.bounds.size.height);     self.boundsLabel.text = [NSString stringWithFormat:@"红色视图bounds%@",NSStringFromCGRect(self.redView.bounds)]; } 我如果说改变bou....

阅读全文 »

WCSession-sendMessage-失败处理

通过手表向手机端发送消息时出现Payload could not be delivered(中文环境下:未能传送负载)的错误提示,如果你保证你的设置都对的情况下,请记得检查手机端WCSession实现的代理方法全不全 如果你是这样发送消息 session.sendMessage(["request" : "list"], replyHandler: nil, errorHandler: { (error) in print(error)}) 那么在手机端你要有这样的代理方法 public func session(_ session: WCSession, didReceiveMessage message: [String : Any]) 如果你是这样发送消息 session.sendMessage(["request" : "list"], replyHandler: { (result) in print(result) }, errorHandler: { (error) in print(error) }) 那么在手机端你要有这样的代理方法 public func se....

阅读全文 »

iOS学习笔记 有更新!

autoLayout Autolayout 的作用非常明确:帮我们确定在不同设备、不同(父 view)环境下,同一个可视单元所应具有合适的位置和尺寸,因此,当一个 UIView 上所施加的约束能够唯一确定它的 frame(x, y, width, height)的时候我们的自动布局的使用才是正确的。而新手通常犯的两类错误就是约束不足(约束太少)和约束冲突两种(约束太多)。如果你给出的约束只能够确定这个 view 的大小,或者位置或者位置中的某一个项(比如 x)的时候,就会出现约束不足的情况,在 xib 或者 storyboard 中,会以黄色的警告出现在左侧提示框内;如果你给出的约束推导出了两个甚至多个互相矛盾的位置尺寸结果的时候,就产生了布局错误,在编译的时候直接就 build 不过。 画布中角度是顺时针转的 贝泽尔曲线添加圆弧 clocwise 参数就是常规理解顺时针,core graphics 添加圆弧时此参数正好相反 更新:关于角度的旋转方向,其实是按逆时针转动的,但是因为在一些坐标系里对 Y 轴进行了变换(乘以-1)导致成了顺时针转动,这也解释了上边引用里的说明 [参考](https://de....

阅读全文 »

ReactiveCocoa解读-订阅信号

信号(Signal)和订阅者(Subscriber)是在ReactiveCocoa( 下文简称RAC)的相关资料中提到最多的概念了,但因为是从英文语境中直接翻译过来的,让国内大部分开发者对订阅信号一时难以理解,即使掌握了RAC的用法对此还是模棱两可。今天,我们尝试从RAC的源码去解读,看看订阅信号到底是个啥子过程。 先上一段RAC最简单的使用方法。 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {         [subscriber sendNext:@"钢铁锅"];         [subscriber sendNext:@"含眼泪喊修瓢锅"];         [subscriber sendNext:@"坏缺烂角的换新锅瓢乱放"];         [subscrib....

阅读全文 »

UIImagePickerController不走回调的问题

今天又遇到了一个奇怪的问题 代码如下: UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.allowsEditing = YES; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.delegate = self; [self presentViewController:imagePicker animated:YES completion:nil]; 用法很对,没毛病,可就是不调用 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info 分析原因 UIImagePickerController实例对象被释放了 //这不可能....

阅读全文 »

回头看UITableView(三)-下拉刷新的实现

最近陷入了项目中一个日历月视图与周视图切换效果的实现,长时间没有实现想要的效果,沮丧至极。烦请有好想法的同学指点一二,在线等@留什么白。 结束例行的啰嗦,进入正题。 大家可能都用过MJRefresh,十分之方便,李明杰老师借助runtime的特性,极尽之能,让千千万万小白开发者和遵循不重复制造轮子原则的开发者用最少的代码就实现了界面下拉刷新的功能。我们今天不谈runtime的黑魔法,而是UITableView最常见的刷新数据方式下拉刷新的实现过程。 首先,我们定义三个枚举值 typedef NS_ENUM(NSUInteger, RefreshState) {     RefreshStateNormal,//正常     RefreshStatePulling,//释放即可刷新     RefreshStateLoading,//加载中 }; 分别表示正常状态、释放即可刷新状态、加载中状态 为了简单说明,我们只用一个UILabel来表现就可以,把它放在内容上方,也就是正常情况下看不到的地方,只有下拉的时候才能看到。 然....

阅读全文 »

为什么dispatch_sync在主线程会死锁

首先看下面一段代码 dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL); dispatch_sync(queue, ^{//taskA //do something dispatch_sync(queue, ^{//taskB //啥也干不了 }); });     dispatch_sync函数用于将一个block(任务)提交到队列中同步执行,直到block执行完后,这个函数才会返回。queue是一个串行队列,如果先后加入两个任务,taskA和taskB, 那么只有taskA执行完之后taskB才能执行。如果taskB是在taskA中加进队列的,那么它们依然遵守先进先出原则,即taskA执行完之后taskB才执行,也就是taskB在等待taskA完成。但是因为dispatch_sync的同步特性,taskB执行不完taskA就不算完成,即taskA在等待taskB的完成,这样就发生了死锁。 根据上面那份代码,我们就可以理解下面的代码为什么会阻塞主线程了。 dis....

阅读全文 »

IBInspectable无法取值的问题

我在xib文件里用了IBInspectable然后在UIView的layoutSubviews里执行 dispatch_async(dispatch_get_main_queue(), ^{ //some code} 竟然取不到相应IBInspectable标记的值,如果在block的外边重新声明新的变量并赋值才可以 如图: 奇怪的问题,特此记录

阅读全文 »

仿QQ左侧滑动菜单的实现

冲动 最近接手的一个老项目有个侧滑菜单的需求,这个老项目的侧滑菜单用了网络上的一个第三方库,但是这个库竟然没有处理好导航条的显示,以至于项目中很多需要导航条展示信息的视图都通过添加subView的方式模仿了导航条。这简直是暴殄天物啊,放着真正的导航栏那强大的作用不用,浪费了多少时间和精力啊,都是青春啊,开发的前路上早已挖了无数的坑等着身心疲惫的我们往里跳啊。对此深恶痛绝的我,早就下了不杀此贼誓不罢休的决心。好吧,最近看三国看的有点多了。 暗渡陈仓 我在无所不能的GitHub上搜索侧滑菜单项目,试验了各种,发觉没有能很好的符合当前项目需求。我们当前的项目需求是跟手机QQ左侧滑动菜单一样的效果,有个默认的主视图,然后其他视图的展示都是在这个视图的基础上push出来的。当然把这些项目改造出这种功能其实也不难,但是左侧菜单的视差效果都跟QQ相差甚远,唯一相似的就是RESideMenu这个比较有名的项目,但是它的视差效果是菜单在展示过程中由比较大然后缩放到实际大小,感觉不如QQ的效果好,怎奈我当时心情比骄傲浮躁,改了个参数也没调出想要的效果来,于是一怒之下决定自己写一个。事后,发现有个Swi....

阅读全文 »

关于连续触发的函数中动画异常的描述

我想要的过程是这样的,我有两个label像球场上的广告牌一样交替滚动,当前的往上移动逐渐消失下边的从下边同时往上移动逐渐出现。我为了在autolayout下也能实现所以一开始准备用transform实现,但是发现往上移动的动画异常,不知道什么原因,让人郁闷。。。便秘的感觉很久之后,我决定退而求其次,用改变center来实现,问题解决了,但是是建立在我这两个label没有autolayout的基础之上。今天特此记下,留待以后研究。

阅读全文 »