大熊猫侯佩
一枚贪吃路痴还未秃码农。优快云 博客专家,iOS 与 Swift 版块版主,热爱苹果开发。
人生看淡,不服就干!
展开
-
URL 路径中包含百分号需要在 Swift 中的特殊处理
在本篇博文中,我们讨论了使用包含百分号(%)的 URL 路径在 Swift 中需要考虑到的几个地方,为了让大家觉得更加浅显易懂我们还举了一个非常实际的例子。原创 2023-09-18 13:16:54 · 467 阅读 · 10 评论 -
iOS 17 测试版中 SwiftUI 视图首次显示时状态的改变导致动画“副作用”的解决方法
在本篇博文中,我们在 iOS 17 beta 4(SwiftUI 5.0)测试版中发现了 SwiftUI 视图首次显示时状态的改变会导致动画“副作用”的问题,并提出多种解决方案。原创 2023-08-17 21:52:58 · 1091 阅读 · 5 评论 -
iOS 添加本地通知时 App 发生崩溃提示 4097 UserNotificationService 错误的解决
在本篇博文中,我们介绍了 iOS 添加本地通知时发生 “Adding notification request failed with error: ErrorDomain=NSCocoaErrorDomain Code=4097” 错误的原因,并给出解决办法。原创 2022-12-18 06:18:16 · 1391 阅读 · 0 评论 -
CoreData事务记录查询(Query)中NSPersistentHistoryTransaction.fetchRequest总返回nil的解决
在本篇博文中,我们解决了 CoreData 事务记录查询(Query)中NSPersistentHistoryTransaction.fetchRequest 总返回空值的问题,你值得拥有!原创 2022-09-12 17:01:37 · 349 阅读 · 0 评论 -
何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?
在本篇博文中,我们介绍了一个在Xcode中 CoreData 托管对象 Optional 和 Default Value 选项都为默认值时,可能掉入的一个大坑,并给出解决办法。原创 2022-08-27 19:00:03 · 414 阅读 · 0 评论 -
CoreData请求(Fetch Request)中断言(NSPredicate)使用的一个误区
本篇博文中,我们来讨论一个使用断言的误区:貌似断言构造正确,但CoreData请求的结果总为空。原创 2022-05-12 07:15:36 · 473 阅读 · 1 评论 -
SwiftUI如何监听WKWebView加载网页的进度
在本篇博文中,我们介绍了SwiftUI监听网页加载进度的三种方法,任君选择。 ;)原创 2022-05-06 21:11:45 · 1127 阅读 · 0 评论 -
Xcode 13如何使用本地Swift包(Swift Package)
我们知道Xcode可以随心所欲的引用Apple自己或第三方的Swift包,但大多数情况下这些包都处于网上的github仓库中。如果因网络原因导致github网站访问不稳定,那么Xcode就无法正常抓取该Swift Package包,然而我们可以直接引用本地的Swift包,Let's GO!原创 2022-04-21 10:23:37 · 2830 阅读 · 2 评论 -
Sheet弹出视图在SwiftUI中“怪异”行为的解决(第一次弹出视图的可选属性总得到nil值)
SwiftUI 3.0中,在sheet中弹出包含nil属性的子视图时传递的是非nil值,但第一次子视图中获取的却是nil值;但随后传递非nil值的操作,子视图的行为都正常。且看我们如何解决。原创 2022-03-21 13:42:37 · 2891 阅读 · 0 评论 -
最新Xcode 13.3RC对SwiftUI和CoreData中两个恼人问题的修复
介绍最新Xcode13.3RC中修复SwiftUI和CoreData的一些烦人问题,将会在随后持续更新Xcode13.3RC的使用体验。原创 2022-03-10 09:09:19 · 656 阅读 · 0 评论 -
iOS 15.3+ SwiftUI的Form视图中嵌入List及Button若干诡异行为的解决
在iOS 15.3+系统中嵌入Form中的List和Button在一定条件下会有兼容性问题,我们如何规避它们呢?Let's find out!原创 2022-03-08 12:29:45 · 570 阅读 · 0 评论 -
SwiftUI Xcode项目新增单元测试(Unit Test)后预览(Preview)崩溃的解决
Xcode里的SwiftUI项目在添加单元测试后,回到任意SwiftUI View的预览界面,会发现预览视图发生崩溃,如何解决呢?原创 2022-02-24 15:44:19 · 1054 阅读 · 0 评论 -
Swift如何兼顾协议中默认和自定义方法的调用?
Swift是一个面向协议而不是对象的语言,在遵守协议的同时,我们能否兼顾协议中默认方法和定制方法的调用呢?答案是实现方法还不止一种,小伙伴们快快围观吧? ;)原创 2022-02-04 20:07:38 · 1103 阅读 · 0 评论 -
Combine框架中两个相近操作符scan和reduce探究
Combine框架中两个有趣的操作符scan和reduce还可以这么玩,带您深入浅出的了解它们,小伙伴们快来围观哈。原创 2022-02-04 14:54:18 · 484 阅读 · 0 评论 -
SwiftUI出现displayModeButtonItem is internally managed and not exposed for DoubleColumn style错误的解决
Xcode12.x开发环境中,用户在点击SwiftUI列表项进行导航跳转后,当回退到父视图时,Xcode控制台会有提示: [Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.原创 2022-01-03 19:26:45 · 818 阅读 · 0 评论 -
Swift将CoreData托管对象转换为Json文本的另一种思路
托管对象到Json的转换我们知道在Apple开发中,要想为类或结构提供到Json的自动转换,我们需要让类或结构遵守Encodable协议。如果该类或结构中的所有属性都遵守Encodable协议,那么你不用再费事多写一行代码了。但让CoreData的托管类遵守Encodable协议并不那么容易,绝大多数情况下,你需要为托管类的每一个属性去写特定的转换方法。假设一种情况:CoreData托管类只需要将其中一小部分数据转换为Json,而其他大部分内容都可以从这一小部分数据中推导出来。如上图所示,Pr.原创 2021-01-29 12:43:39 · 451 阅读 · 0 评论 -
SwiftUI中sendAction无法正确被发送的解决
1. SwiftUI取得当前输入视图的尺寸在SwiftUI中,有时希望获取当前界面中输入焦点所在视图的尺寸,我们可以通过向App当前UIResponder响应对象发送消息来完成。网上现成的一段代码如下:extension UIResponder { private static weak var _currentFirstResponder: UIResponder? static var currentFirstResponder: UIResponder? { _.原创 2021-01-08 13:32:40 · 540 阅读 · 0 评论 -
iOS中NSDecimalNumber类的一个BUG
我的编程环境是XCode 11.5。今天在测试秒表代码的时候偶然发现秒表计数会是负值,由此进行了下面的一番探索。为了精确,秒表走过的秒数用Decimal类型:@Published var elapsedSeconds_exactly: Decimal = 0.0在实际使用时需要将其转换为整数类型,由于Decimal没有直接的方法转换为整数,所以我用的是如下的迂回战术:NSDecimalNumber(decimal: elapsedSeconds_exactly).intValue前面提到秒表原创 2020-06-17 21:29:06 · 565 阅读 · 0 评论 -
Swift一个小例子带你了解Combine中多重订阅不丢失(auto replay)的方法
引子Combine中虽然有众多内置Operators,但是要想实现对同一个Publisher多次订阅,且结果不丢失还是比较棘手的,除非实现自定义Publisher,但这不是今天我们的话题 ????什么是多重订阅?多重订阅就是多个订阅者订阅同一个Publisher。什么是多重订阅不丢失?不丢失指的是,在有多个订阅者的情况下,无论发生何种情况都可确保每个订阅者都可以接收到每一个消息。即这是一个...原创 2020-02-20 09:43:33 · 1623 阅读 · 1 评论 -
Xcode中Playground运行代码无响应的极简解决方法
大多数童鞋可能对Xcode中的Playground又爱又恨,我完全可以体会你们的感受…Playground遇到比较多的一种情况就是:执行代码挂起!就是点击那个小三角运行按钮,等到天荒地老却此情可待成追忆的赶脚…这时你把Xcode彻底的完全的关闭,但仍然没有什么卵用…难道抓狂的你只有重启Mac么???答案当然是:NO!一个非常简单的解决办法是:1.打开活动监视器(就是Windows...原创 2020-01-26 14:40:14 · 2520 阅读 · 0 评论 -
SwiftUI重构功能视图: Never Repeat Yourself!
1.原来视图的架构:我们需要监听一个通知父VC弹出一个子View,其中子View需要接收父VC发出的通知:[父VC]--------弹出-------->[View][View]--------监听-------->[父VC]由于View的特殊性,我们不能直接将监听回调放在View本身,而是要另外写一个类似协调器的东东:class Coordinator { ...原创 2020-01-10 10:12:38 · 874 阅读 · 0 评论 -
iOS第三方动画标签库内存泄露点的寻觅之旅
本博叙述了在使用第三库的过程中,从发现其中有泄露到定位到泄露,最后解决内存泄露的全过程。适合有一定经验的iOS开发者观赏。原创 2019-05-04 11:01:16 · 641 阅读 · 0 评论 -
iOS代码动态消除iPhone X底部工具条(ToolBar)与键盘间的夹缝
在App界面底部增加工具条并不少见,在工具条上增加输入框更所谓是"应知应会".下面本猫就向大家介绍如何适配iPhoneX中底部工具条与弹出键盘的相对位置.原创 2019-04-23 11:10:28 · 2230 阅读 · 0 评论 -
iOS科普一下根View及其子View中心点含义的坑
本文简单介绍了根View以及子View中心的含义。解答了为什么根View的直接子View可以用childView.center = parentView.center来设置中心,但childView的子View不可以这样做的原因。废话?中心什么意思!?的确,中心是什么意思,不是废话么?中心不就是中心么?不过严格来说,在iOS里view的中心(view.center)是其矩形中心点在其父...原创 2019-03-12 10:38:09 · 979 阅读 · 3 评论 -
Swift派生与不派生自NSObject对象之间等于比较的不同
本文简单介绍了Swift中派生与不派生自NSObject的类,在等于比较时表现出的不同行为;还顺带讨论了创建大数组时效率的问题.等于或不等于我们知道对于数组的比较来说,实际比较的是它们中的每一个对应位置上元素.所以最终都是要比较对象的.我们还知道对于Swift中的类来说,要实现==操作符,需要遵守Equatable协议,并实现==方法.比如对于类A来说:class A:NSObje...原创 2019-02-21 11:06:36 · 1749 阅读 · 2 评论 -
简约同样简单:为UISlider添加显示当前值的标签(下)
本文在重构的基础上,从类封装的角度重新实现UISlider的功能扩展:显示当前的值,比之前更加简单和易于维护。建议在看完上篇之后再来观赏。上篇观赏在此 : 简约同样简单:为UISlider添加显示当前值的标签(上)为什么要重写?在上篇里我们已经实现了UISlider的扩展功能,已经可以用了,为什么还要费事再说这个事呢?原因是:它的封装性不足,对外太开放。举个栗子:UISlider上...原创 2019-01-29 14:22:09 · 1164 阅读 · 4 评论 -
简约同样简单:为UISlider添加显示当前值的标签(上)
本文畅想了几种为UISlider添加显示当前值的方法,并选择了其中一个稳定,简单的实现.适合iOS刚入门或中级水平的童鞋们观赏.看不见值?这不科学!默认的UISlider,你可以任意拖动,却看不见当前表示的值…有点盲人摸象的赶脚了…我们一般的做法是用另一个控件表示其当前值,比如一个UILabel.不过这样貌似要另外占用一些空间,不紧凑!看到UISlider上面那个圆圆的把手了么?我...原创 2019-01-27 13:35:26 · 2529 阅读 · 0 评论 -
Swift调用协议扩展导致崩溃的解决
本博向大家介绍Swift对象委托的一种变通方法,但遗憾的是该方法在Swift 4.2中会导致App崩溃,生活还要继续,且看本猫如何解决它喽.什么是对象委托简单的说对象委托就是对象A假装对象B,当然A和B的类完全不同.用过Ruby的童鞋都知道,这很容易完成:Class Account < ActiveRecord::Base delegate :firstnam...原创 2018-12-19 10:36:25 · 1171 阅读 · 0 评论 -
Swift中集合(Set)无法删除自身对象的临时解决方法
这是本猫遇到的比较怪异的问题之一:明明在集合中的对象,但却无法直接删除它。由于原项目较为复杂,为了演示目的,本猫对博文示例代码做了简化,但并不影响问题的表述。背景介绍App逻辑很简单,对象Node对应着TableView中每一行,你不用知道Node对象到底是啥,你只要知道它是列表每一行后面的那个数据对象:class Node:Equatable{ var nodeId:Int va...原创 2018-12-15 16:52:50 · 589 阅读 · 1 评论 -
iOS解决控制器转场和返场界面卡顿的一种方法
本博介绍了在控制器转场和返场时界面发生卡顿的一种解决方法,主要思想是使用视图快照功能来提供一个静态的伪视图以提高性能.转场和返场转场是指从控制器A切换到控制器B中,这意味着控制器A被隐藏:控制器A -> 控制器B而返场是指从控制器B切换回控制器A,这意味着控制器A重新被显示:控制器B -> 控制器A为什么会卡顿?如果在控制器转场或返场时需要播放复杂的转场动画或者在...原创 2018-12-02 16:33:41 · 2686 阅读 · 0 评论 -
iOS:UITableViewCell中Label位置无法正确约束的问题
由于UITableView中某一行文字过多,需要扩展Cell的高度,该Cell的样式是.subtitle:注意其中的detailTextLabel并没有垂直居中!!!咋一看解决应该很简单,做一个约束不就行了:$0.cell.detailTextLabel?.snp.updateConstraints {make in make.centerY.equalToSuperview() ...原创 2018-12-01 09:40:47 · 1145 阅读 · 0 评论 -
利用Xcode内存图工具分析解决App循环引用一例
在调试App时打开Xcode内存图工具,发现有循环引用 由上图可得:SectionTrace对象->SectionDayTracesGroupHeader对象->通过闭包ignore.context->SectionTrace对象同样有SectionTrace对象->SectionDayTracesGroupHeader对象->通过闭包evalu...原创 2018-07-27 20:59:38 · 1429 阅读 · 2 评论 -
如何定制Github中第三方定时器的行为
在某些情况下需要扩展第三方库的行为。对于简单的修改没有什么问题,对于复杂的修改(核心功能),我们首先要做的就是深入库的源代码中理解原理,查找线索,不断测试,最后完成我们的扩展。下面举一例:Github中的MZTimerLabel定时器库该定时器很简练,但功能很强大,其中包含了正计时和倒计时功能。不过我还希望增加一个新功能,就是按秒的个数而不是时间格式来显示。比如现在已计时1分半钟,按照...原创 2018-07-12 10:50:30 · 623 阅读 · 0 评论 -
Xcode项目中使用Quick测试的正确打开方式
本人的运行环境Xcode 9.2 + Swift 4.0 + CocoaPods 1.5.3,虽然不是最新版本但也基本符合目前总体的开发环境。Quick库是用于Swift(和ObjC)语言的TDD框架,它的最佳伴侣是Nimble库。参考github中Quick库在Pods中的配置方法:# Podfileuse_frameworks!target "MyApp" do # N...原创 2018-06-27 10:37:19 · 1340 阅读 · 0 评论 -
解决CocoaPods库图片无法显示的问题-通过修改github第三方库源代码
CocoaPods很好很强大,在使用的时候兼容性和契合度都非常好,极少有出错的情况。但凡事没有绝对,这不本猫在使用TWMessageBarManager库的时候就出现了一段小插曲。TWMessageBarManager库是一个iOS中的显示通知提示栏的库,非常简洁,虽然该库已经很多年没有更新了,但并不影响其在github的star数量。我基本上在使用一个较复杂的库之前,尤其是其文档略模糊,...原创 2018-06-19 08:59:08 · 2314 阅读 · 0 评论 -
重写Github的TreeTableView库实现定制显示子节点
TreeTableView是一个非常简洁的库,用来在TableView显示树状的结构,非常棒!github地址在这里:https://github.com/yixiangboy/TreeTableView看样子也是我大中国同胞写的没跑了 ;)不过俗话说的好,再好的东西不符合自身的特色也是白搭;所以难免要对其做些修改。这里我定义了3层数据结构Group->Folder->...原创 2018-06-11 10:12:30 · 680 阅读 · 0 评论 -
Eureka中设置TextRow占位符颜色需要显式刷新的解决
Eureka中TextRow有一个placeholderColor属性,用来设置占位符的颜色:row.placeholderColor = .white不过经过测试,这样设置要想生效必须要显式刷新一下UI,这可不是我们想要的 ;(实际上placeholderColor属性会最终设置TextRow的Cell里的UITextField的占位符颜色,不过它到底是怎么做的呢?因为UITextF...原创 2018-06-05 15:52:51 · 444 阅读 · 0 评论 -
iOS编程设置UI布局限制的另一种方法
额…之前本猫一直使用IB来处理UI布局,虽说比较直观,但是对于比较复杂的界面,这样做还是有一些问题的…主要是你的限制貌似很好很完美,但是切换到不同Device后,还是会发现不和谐的黄感叹或红感叹号的存在… ;(这是因为你很难将所有设备的所有情况都考虑到,你在一种设备界面上设置限制,然后想当然觉得这应该会应用到所有设备上…这还只是同类设备会出现的情况.所谓同类是指,你只在所有iPhone上运...原创 2018-06-02 20:39:45 · 706 阅读 · 0 评论 -
iOS11中另类自定义UITableViewCell删除按钮的外观
iOS不同版本中对于TableView行的删除按钮的实现内部是不一样的,甚至传说不同Xcode版本编译出来的App里也是不一样的:iOS 8-10: UITableView -> UITableViewCell -> UITableViewCellDeleteConfirmationView -> _UITableViewCellActionButtoniOS 11 ...原创 2018-05-05 17:39:11 · 1509 阅读 · 1 评论 -
Swift:"奇怪"的事件响应链
初学iOS开发的童鞋可能会遇到各式奇怪的问题,这篇博文本猫就为大家介绍其中一个”怪异”问题.该问题很好重现: 1.使用xcode新建一个最简单的单vc工程,然后在Storyboard中新建一个destVC.然后从默认创建的VC(姑且称之为initVC)拉一条segue到destVC,并设置该segue ID为”ToDestVC”2.打开initVC类,只添加2个方法:override func t原创 2017-10-03 18:51:51 · 1757 阅读 · 1 评论