触摸屏后调用 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的主要内容,如果未能解决你的问题,请参考以下文章

WPF 禁用TextBox的触摸后自动弹出虚拟键盘

WPF 禁用TextBox的触摸后自动弹出虚拟键盘

在ViewController中View的生命周期

动画结束后无法激活 View Touch 事件

iOS学习笔记05-触摸事件

Android系统全局触摸事件监听