viewWillAppear在触摸屏后调用

时间:2018-03-19 03:31:00

标签: ios swift viewwillappear

当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)
 })

1 个答案:

答案 0 :(得分:0)

尝试使用viewdidappear而不是viewwillappear