
获得徽章 12
- 推荐国内首款专为开发者开发的一个集输入增强、代码片段管理(支持 Markdown)为一体跨平台云同步的开发工具。神器中的神器~~
- 无限公共/私有片段
- 无限片段分组
- 云同步、在线编辑、分享支持
- 即时指令支持
- 动态脚本片段支持
- 自定义日期、模拟键盘宏、生成文本模板支持
- 代码高亮、格式化、替换等支持
- 生成主题代码片段图片
- 全片段搜索展开评论10 - 2915
- #iOS知识小集#「 针对 objc_exception_throw 的实用调试技巧 」
相信调试过程中发生崩溃这种事情,大家肯定都遇到过,一般也会给 Xcode 设一个全局共享的异常断点,如图1所示,(如果没有的话,可以设置一波)。当我们调试遇到抛出异常时,Xcode 会自动断点,输出一些关于 Exception 的日志信息。但是有些时候并不见得会输出有用的日志(或者压根就没有日志)只有对应的崩溃栈,如图2所示。
示例中向 NSArray 发了一条无法响应的消息,崩溃后 Xcode 自动断点到了相应的断点位置(这里其实 Xcode 已经在 console 中输入了对应的崩溃信息,因为一时半会不知道该怎么制造 Xcode 不输出日志的环境,所以将就用这个示例来代替下),同时左边也有了对应的崩溃调用栈。我们可以将调用栈切到最上方的 objc_exception_throw,然后在 console 中输入 po $arg1,因为 arg1 代表的是对象本身,在这里就是 NSException,而它又复写了 description 方法,所以对其 print 输出的是对应的崩溃信息。
以上其实我们还可以节省一个步骤,就是编辑一下这个全局异常端点,给起加一个 Debugger Command 的 Action,如图3所示,这样就可以在发生 objc_exception_throw 崩溃的时候,就可以自动输出对应的崩溃信息了,而不用再手动切换到栈顶的 objc_exception_throw 再输一遍 po $arg1。需要明确一点的是,这种方式仅适用于 objc_exception_throw 类型的崩溃(模拟器、真机都适用)。
其他几个有意思的参数值,上面说到 arg1 是当前断点所在方法的接收对象,arg2 是被调用的方法名(在 po 的时候要做一个强转,如 po (SEL)$arg2),如果有参数则 arg 依次递增。
另外 lldb 的其它更多命令及便捷或扩展的方式,推荐 Facebook 的 Chisel
个人使用频率最高的就是真机调试动画,放慢动画速度的命令,运行过程中触发任意一个断点,执行 slowanim 即可(默认10倍速慢放,可自行在后面指定慢放倍数,如 slowanim 0.2 就是慢放5倍)。展开评论5 - #iOS知识小集#「 UITextField监听键盘删除操作 」
当UITextField控件内容不为空的时候,可以通过UITextFiedlDelegate协议中的- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string方法知道用户是否点击了键盘上的删除按钮,判断string.length是否为0即可;而当删除完所有的文字之后,再点击删除按钮,这个回调是不执行的,那么该怎么办呢?
可以这样做:UITextFiled是遵循UIKeyInput协议的,可以重写deleteBackward方法,或者swizzle这个方法,就可以啦,不要忘记执行一下原有方法哦,否则原有点击删除按钮会无效。这种方式不管输入框内是否有内容,都可以知道用户是否点击了键盘上的删除按钮。
另外,如果想实现一些简单的文本输入,比如说微信或者支付宝输入密码的控件,输入验证码控件等,不需要UITextFiled或者UITextView那么多冗余的功能,可以直接自己实现UIKeyInput协议,非常的给力!展开评论9 - #iOS知识小集#「 使用setViewControllers方法来实现页面跳转 」
使用setViewControllers方法来实现页面跳转
当我们对UINavigationcontroller控制器进行Push和Pop操作时,其实是对UINavigationcontroller控制器的子控制器栈ViewControllers进行入栈和出栈操作,有些复杂的页面跳转需求,通过Push和Pop并不能很好实现,有例如我们需要由控制器A跳转到控制器B,B控制器返回时要返回到之前没有创建的控制器C,如果是先Pop再Push,在切换过程中,会显示出控制器A的内容, 不能很好的实现我们的需求,我们可以通过调用setViewControllers 方法来更改UINavigationcontroller的子控制器栈并应用到当前的 UINavigationController来完成页面跳转,具体代码如图所示:展开评论7 - #iOS知识小集#「 解决 tableview 刷新闪一下或抖动的问题 」
我们知道 tableview 刷新有分全局刷新和指定区域刷新。
- 全局刷新 - (void)reloadData;
- 指定区域刷新有以下两个方法。
```
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
```
tableview 或者是 collectionview,reload 时默认会有一个隐式的 Fade 动画,有时视觉上会有闪一下的情况。指定区域刷新时,只要将 UITableViewRowAnimation 设为 UITableViewRowAnimationNone 即可取消隐式动画。
那么全局刷新时,该如何取消隐式动画?
方法一:
如果你的 tableview 的行高是根据数据自适应的,那么在设置完 estimatedRowHeight 后,在需要 reloadData 的地方加上。
```
[self.tableView beginUpdates];
[self.tableView endUpdates];
```
(ps: 以上方法用于 tableview 刷新时因预估行高和实际行高不一致情况下抖动的问题,有些人视觉上可能也觉得会闪一下。)
方法二:
使用 UIView 类方法去取消隐式动画,在 block 回调里去 reloadData。该方法对 collectionview 刷新同样有效。
```
+ (void)performWithoutAnimation:(void (NS_NOESCAPE ^)(void))actionsWithoutAnimation NS_AVAILABLE_IOS(7_0);
```
参考链接:t.cn
展开评论8