【发布时间】:2018-03-19 03:31:00
【问题描述】:
当 B -> present -> C 时,它自动调用 viewWillAppear,但是在我从 C 解散到 B 和 B -> present -> C 之后,viewWillAppear 在我触摸屏幕后调用, 这是
1.B -> 现在 -> C,第一次ok
2.C -> dismiss -> B -> present -> C, viewWillAppear 在我触摸屏幕后调用
当我展示C时,viewdidload被调用了,但是在我触摸屏并调用viewWillAppear之后视图并没有改变,所以如果我没有触摸屏,我的屏幕看起来像B,但实际上,C已经完成了viewdidload。
c 是带有表格视图的滚动视图内容,一些答案提到了导航控制器,但我根本没有使用任何导航控制器。
B -> C,当我从表格视图中选择时调用
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let l3ViewController = Utl.getViewControllerWithStoryboard("Home", identifier: "L3ViewController") as? L3ViewController
guard let vc = l3ViewController else {
return
}
self.presentDetail(vc)
}
}
self.presentDetail(vc) 是我的 UIViewController 扩展,但是当我尝试使用 present(viewController, animated: false) 时,问题也会发生,所以这个扩展似乎没问题
extension UIViewController {
func presentDetail(_ viewControllerToPresent: UIViewController) {
let transition = CATransition()
transition.duration = 0.3
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromRight
self.view.window!.layer.add(transition, forKey: kCATransition)
present(viewControllerToPresent, animated: false)
}
func dismissDetail() {
let transition = CATransition()
transition.duration = 0.3
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromLeft
self.view.window!.layer.add(transition, forKey: kCATransition)
dismiss(animated: false)
}
}
查看C
override func viewDidLoad() {
super.viewDidLoad()
// some of functions
dataKeyAndValue()
calculateLabelXAndWidth()
// some of my view set up here
setProcessView()
setScrollView()
setTableView()
print("view did l3")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
print("view will l3")
}
如下所示的NSLOG
// B -> C first time
2018-03-19 11:50:45.885423+0800 ROLLCALL[5624:204120] viewDidLoad l3
2018-03-19 11:50:45.888306+0800 ROLLCALL[5624:204120] viewWillAppear l3
// back to B and presnt to C
2018-03-19 11:50:50.295844+0800 ROLLCALL[5624:204120] viewDidLoad l3
// touch screen
2018-03-19 11:50:52.369439+0800 ROLLCALL[5624:204120] viewWillAppear l3
我确实注意到这个问题是从使用轻量级迁移核心数据开始的,以前有人有过同样的经历吗?
编辑
在某些情况下,我确实使用了下面的一些警报。
let alertController = UIAlertController(title: "",message: nil,preferredStyle: .alert)
self.present(alertController, animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
self.presentedViewController?.dismiss(animated: false, completion: nil)
}
回答
我现在把这个方法从B改成C,效果很好,谁能给我解释一下?
DispatchQueue.main.async(execute: { () -> Void in
self.presentDetail(vc)
})
【问题讨论】:
-
请出示相关代码
-
您在视图控制器转换期间是否添加了任何
async操作?像线程或dispatchQueue -
我多次添加
DispatchQueue.main.asyncAfter以显示提醒
标签: ios swift viewwillappear