当B - >;礼物 - > C,它自动调用viewWillAppear,但是在我从C解除B到B和B之后 - >礼物 - > C再次,viewWillAppear在我触摸屏幕后调用,
1.B - >礼物 - > C,第一次确定
2.C - >解雇 - > B - >礼物 - > C,我触摸屏后调用viewWillAppear
当我呈现C时,调用viewdidload但是在我触摸屏幕并调用viewWillAppear后视图没有改变,所以如果我没有触摸屏幕,我的屏幕看起来像B,但实际上,C完成了viewdidload。 / p>
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)
})
答案 0 :(得分:0)
尝试使用viewdidappear而不是viewwillappear