iOS开发遇到的一些小问题记录

2023-02-15 15:04:59 浏览数 (1)

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 否则会没有效果

0 人点赞