ios - UINavigationController 返回 nil Swift
问题描述
当我尝试或一切正常print(self.navigationController)
时。但是当委托从 API 返回响应时返回。会是什么呢?viewWillApear
viewDidLoad
print(self.navigationController)
nil
extension EnterpriseList: APIDataDelegate {
func successRequest() { //print(self.navigtionController) == nil
DispatchQueue.main.async {
self.navigationController?.popToRootViewController(animated: true)
}
}
func badRequest() {
DispatchQueue.main.async {
Alert.showWarningAlert(withTitle: "Внимание!", andMessage: "Ошибка получения данных, попробуйте чуть позже", whereSender: self)
}
}
}
解决方案
class EnterpriseList: UIViewController {
let dataSource = DataSource()
override func viewDidLoad() {
super.viewDidLoad()
dataSource.delegate = self
dataSource.makeAPICall()
}
}
extension EnterpriseList: APIDataDelegate {
func successRequest() {
DispatchQueue.main.async {
self.navigationController!.popToRootViewController(animated: true)
}
}
func badRequest() {
DispatchQueue.main.async {
}
}
}
protocol APIDataDelegate: class {
func successRequest()
func badRequest()
}
class DataSource {
var delegate: APIDataDelegate?
private let queue = DispatchQueue(label: "Test", qos: .background, attributes: [], autoreleaseFrequency: .inherit, target: nil)
func makeAPICall() {
queue.asyncAfter(deadline: .now() + 2) {[weak self] in
self?.delegate?.successRequest()
}
queue.asyncAfter(deadline: .now() + 10) {[weak self] in
self?.delegate?.successRequest()
}
}
}
崩溃是因为您在已释放对象上调用该方法。
以下是解决此问题的方法:使您的委托很弱,并且您正在正确地释放对象
weak var delegate: APIDataDelegate?
推荐阅读
- asp.net-mvc - Azure .Net Framework 4.8 向后兼容性
- angular - 尝试设置笑话的问题:应用程序代码编译得很好,但测试代码没有
- css - 悬停元素内的CSS更改类
- android - Android - 在通知上单击打开文件并按回不显示应用程序
- python - Altair 图表图例中的元素数量
- angular - Angular 编译之间的差异
- r - 创建一个循环函数结果的数据框
- json - TypeError: JSON.stringify(...).then 不是函数
- mysql - 用 union 改变结果的mysql顺序
- list - 具有小二进制占用空间(千字节)的虚拟机/编程语言