1. tableView下方出现莫名的空白
tableFooterView问题 一般来说,tableview会默认有一个footerview 解决:在视图加载时将这个footerview设为没有高度或者是空view就可以
代码语言:javascript复制tableView.footerView = UIView()
tableView.footerView.height = 0
contentSize自动计算问题 tableView会有一个自动计算contentSize的功能 即我们改变dataSource里的数据刷新视图的时候,tableview的总高度是被改变的,而这时自动计算出来的,不像scrollview是需要手动指定的。这时如果系统计算的预估值出现误差就会出现空白的问题。 解决: 设置tableView的自动预估值为0
代码语言:javascript复制tableView.estimatedRowHeight = 0
2. _IBBrokenImage_报错问题
storyboard中存在丢失的图片问题、(可能原先存在于Assets文件夹、后来丢失、或是Contents.json中有,但是图片资源不存在) xcode生成了代码方式的图片。
解决:以源代码方式打开storyboard文件、检查是否有大量堆砌代码的图片文件。直接删除掉。 重新以视图方式打开,提示丢失文件,在画面中可以看到一个?图片。重新设置一张图片即可!
3. performSegue不响应问题
在测试segue的时候,直接使用代码调用,结果始终没有效果。改成用 UIButton Action的方式有效,仔细搜索并分析发现问题主要是 在viewdidload周期内的segue会被最后更新的UI视图覆盖掉、也就是当前页面的主视图。所以看不出效果。
解决:将代码触发的performsegue写在 viewDidAppear事件或更往后的周期内。
代码语言:javascript复制override func viewDidAppear(){
performsegue(withIdentifier:"homeOpenSetting",sender:self)
}
4. IAP 重复回调的问题
在测试iap支付的时候,发现每次请求都会打印出两次一样的消息,后检查出重复添加了SKPaymentQueue的侦听 另外尽量不要分散在各个地方写侦听,因为不会报错
5. UI接口在后台线程调用问题
封装了一个loading、alert模块,测试中经常出现控制台报 Main Thread Checker: UI API called on a background thread,并且偶尔会直接造成崩溃 出现这个问题主要原因是,通常的UI界面(UIViewController)中的内容都是在主线程中运行、而很多其他的功能 诸如支付队列等 是在后台线程中运行、主线程是UI阻塞的,而后台线程是非阻塞的,当非阻塞线程中的某个函数在循环的时候向某个UI发起调用,如果在主线程中,这个函数就已经被阻塞了,而后台线程不会,这时重复向UI发起调用,就可能导致指针冲突等意外问题。所以要尽量避免这样的情况。 解决:在iOS开发中,使用delegate方式可以用来解决后台线程调用问题。 实际上这个时候是 UI, 后台线程组件 分开运行在 主线程、后台线程中。 后台线程通过delegate向主线程发起调用。将写在后台线程函数里的调用 转移到前台界面部分来实现。
6. 为类添加协议( protocol )
类的协议 需要和类是单独的两个类,相当于一个明星需要一个经纪人一样
代码语言:javascript复制class Star:Person{
var delagate:StarDelagate?
}
protocol StarDelagate{
func didReceiveInvitation( from:Person, price:Int ) -> Bool
}
7. segue只能在storyboard中定义
segue的设计初衷就是基于storyboard提供一个标准化页面桥接功能,所以只能在storyboard中拉线(基于xib)。
8. 基于iOS自带的邮件反馈kit开发用户反馈功能
用Swift写一个发送邮件的iOS用户反馈 - 简书
9. 动态切换tableViewCell类型/模板时没有反应
需要在切换tableViewCell类型之前先定义好style 否则会没有效果