PDF 课件和源代码下载地址:
作者回复: 一起加油!
作者回复: .m里面的interface其实就是类扩展的一种方式,可以看到在类名字的后面加了括号,但是没有继承的声明。这种扩展方式也可以写在其他文件,用于扩展一些特殊的属性和方法,比如流行的SDWebImage就对各个基础的UI类做了扩展。对于你问题中的实现方式,在.h.m中使用类似的扩展,其实就是将私有的属性写在.m文件中,只将对外暴露的属性和方法写在.h中。
作者回复: gcc的一种扩展,具体可见https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 在代码多的时候很好用
作者回复: 是的,从代码规范和安全性的角度讲,我们建议任何id、nsobject以及[__kindof **]等等的类,使用时都在类型判断之后进行指定的转换。同时对于容器来说,也建议声明对应的范型,比如NSArray <NSString *> *array。对此一般项目也都会封装一些 IS AS 之类的工具类,来方便开发者的使用。
作者回复: 好的,如果时间允许的话也建议您跟着视频动手实现一遍代码,会加深记忆~
作者回复: 我们看 UITableViewCell 的头文件,可以看到它时继承自 UIView,所以肯定也有 initWithFrame 方法。同时我们看 UITableViewCell 本身的 initWithStyle:reuseIdentifier:方法,作为 UIView 的子类,为了实现自身特殊的复用能力,所以需要传递 reuseIdentifier 在内部进行一些业务逻辑才能达到效果。(// Designated initializer. If the cell can be reused, you must pass in a reuse identifier. You should use the same reuse identifier for all cells of the same form. )
作者回复: 行间距需要使用NSMutableAttributedString 设置NSMutableParagraphStyle 以及相关的属性哈。可以使用类似的关键字搜索下。简单的代码如下: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineSpacing = lineSpacing; //设置行间距 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"展示的文字"]; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [text length])]; label.attributedText = attributedString;
作者回复: layoutTableViewCell 这个是我们自定义的函数,并不是系统的。所以如果想要执行,需要主动的调用这个函数哈。对于系统的delegate,是由系统触发的,而我们自己实现的函数,需要我们主动触发哈~ 具体tableView的文档,都在UIKit中的UITableView.h 文件中。我们可以通过快捷键command+Shift+O 也就是file菜单中的open quickly,打开输入框,然后输入对应的文件名就可以跳转。
作者回复: UILabel应该在iOS13的开发上没有明显的改变。 能描述下具体的问题,或者有什么报错或者Log麻烦提供下,或者上传下代码,我帮你看下。
作者回复: 方便往往带来的是不够灵活和深入。当然对于一个中小型App不使用纯代码是没有问题并且能胜任的,但是对于大型的App,无论从需求的复杂程度、组件的封装复用、性能的深入优化等,以及多人协作管理方面,frame都会带来很多的便利。当然两种方式背后的原理和布局思路是一致的,只是在实现的层面略有不同,掌握了一种也可以很快的切入另外的一种。