嗯..! 2019 年 11 月 共 22 篇日志。 继续努力。

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....

阅读全文 »

Swift中CGAffineTransform那点事儿

title:Swift中CGAffineTransform的那点事儿 tags: - Swift - CGAffineTransform categories: - iOS 关于CGAffineTransform的介绍可以说一搜一大把,它的主要作用就是能对UIView进行变换,例如缩放、旋转、移动,这里推荐官方介绍。今天我在这里就不赘言了,主要强调几点: 补习矩阵计算的知识 矩阵乘法规则 A*B=C 横着称为行,竖着称为列 A的行数等于B的列数时A和B可以相乘 C的行数等于A的行数,C的列数等于B的列数 A的第一行的数分别乘以B的第一列的相同位置的数最后得到的和就是C的第一行第一列的数(文艺说法:乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和) 混合变换 在平时的开发中我们常常会遇到需要对View进行多次变换的场景,例如:把长宽(100,100)都为父视图长宽(200,200)一半的视图变换的跟父视图一样大小并移到父视图的中心 问:要想实现需要上边的变换需要几步? 答:两步。第一步,将长宽都放大到原来的2倍;第二步,将视图移动到父视图的中....

阅读全文 »

回头看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....

阅读全文 »

SSH免密登录

说明 Client -> 你当前使用的设备,例如我正在敲代码的MacBookPro Server -> 你要免密登录的服务器 在Client上生成秘钥 打开终端输入命令cd ~/.ssh 继续输入ssh-keygen -t rsa,然后一路回车 执行命令cat id_rsa.pub>>authorized_keys 修改文件authorized_keys的权限,执行命令chmod 600 authorized_keys 修改目录*~/.ssh*的权限,执行命令chmod 700 ~/.ssh 复制公钥文本,输入cat authorized_keys,然后复制出现的文本。形如以下 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsopScfdy/3dfxLXErZVX5ZHn83mA8a/YZyo29FbEoOf3ayPSbK1jUZRbC1bEV86g3PcdwNqZOakaaAQpqT74aKx3+1AfsrxLD1mar6NnUd6Rlup7FrTe7lD4MNj5brK+PJtzFpV2gzszCeS34ZvfnlNv....

阅读全文 »

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....

阅读全文 »

好用的命令 有更新!

列出Mac中所有有效的证书 security find-identity -v -p codesigning 列出Mac中的所有provisioning profile fastlane sigh manage 删除provisioning profile fastlane sigh manage -p name 拷贝内容到剪切板 cat a.txt | pbcopy

阅读全文 »

“私密相册-就不让你看”用户隐私声明

“私密相册-就不让你看”客户端是一款工具类App,以下简称本应用。 本应用尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息。但本应用将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,本应用不会将这些信息对外披露或向第三方提供。本应用会不时更新本隐私权政策。 您在同意本应用服务使用协议之时,即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本应用服务使用协议不可分割的一部分。 1 . 适用范围 (a) 在您注册本应用帐号时,您根据本应用要求提供的个人注册信息; (b) 在您使用本应用网络服务,或访问本应用平台网页时,本应用自动接收并记录的您的浏览器和计算机上的信息,包括但不限于您的IP地址、浏览器的类型、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据; (c) 本应用通过合法途径从商业伙伴处取得的用户个人数据。 您了解并同意,以下信息不适用本隐私权政策: (a) 您在使用本应用平台提供的搜索服务时输入的关键字信息; (b) 本应用收集到的您在....

阅读全文 »

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实例对象被释放了 //这不可能....

阅读全文 »

VS保存时自动格式化导致ejs编译错误

ejs模板引擎不知道大家有没有好的格式化插件,有的话,求一个 最近遇到一个ejs解析的问题,非常小心的写好ejs文件,一运行出了错,如下 Invalid or unexpected token in /Users/wang/Desktop/Work/Node/nobook/views/web-index.ejs while compiling ejs If the above error is not helpful, you may want to try EJS-Lint: https://github.com/RyanZim/EJS-Lint SyntaxError: Invalid or unexpected token in /Users/wang/Desktop/Work/Node/nobook/views/web-index.ejs while compiling ejs If the above error is not helpful, you may want to try EJS-Lint: https://github.com/RyanZim/EJS-Lint ....

阅读全文 »

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

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

阅读全文 »

Swift小知识 有更新!

title: Swift 小知识 date: 2019-02-27 10:42:55 tags: - Swift categories: - iOS class 修饰的 func 可以被重写,static 不可以 protocol 中要求实现的方法必须保证访问控制修饰符也要正确,尤其是对于可选实现的方法,如果修饰符不对就会被当做没有实现 如果调用 Error 的 localizedDescription 方法跟你重写的内容不一样,那你八成是没有让你的 Error 实现 LocalizedError 协议

阅读全文 »

为什么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....

阅读全文 »

Flutter学习笔记(持续更新)

InkWell (中文俗称 水波纹、油墨等) 如果在调试时发现没有效果,首先确认有没有给onTap赋值,而且必须不能是匿名空函数()=>{},必须有实现,其次再包裹Material调试

阅读全文 »

IBInspectable无法取值的问题

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

阅读全文 »

仿QQ左侧滑动菜单的实现

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

阅读全文 »