触摸屏后调用 viewWillAppear
Posted
技术标签:
【中文标题】触摸屏后调用 viewWillAppear【英文标题】:viewWillAppear called after touch screen 【发布时间】: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
以显示提醒
【参考方案1】:
尝试使用 viewdidappear 代替 viewwillappear
【讨论】:
viewdidappear 在我触屏后也被调用 上一页还需要使用viewdiddisappear。 在上一页添加 viewdiddisappear 后没有任何变化以上是关于触摸屏后调用 viewWillAppear的主要内容,如果未能解决你的问题,请参考以下文章