弹出VC时,3D Touch会调用viewDidDisappear

问题描述 投票:3回答:2

我正在努力解决我的iOS应用程序中的peek和pop功能。在我想要弹出的VC中的viewDidDisappear方法中,我有一个函数来删除一些与模型相关的观察者。如果我现在偷看新VC,它会初始化观察者。现在的问题是,如果我弹出VC,它会调用viewDidDisappear方法并删除我想要避免的这些观察者。如果用户取消了peek动作,我只想删除观察者。我已经和一些布尔人玩过了,但那并没有成功。

解决这个问题的最佳方法是什么?

这是我的3D Touch设置

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

    guard let indexPath = tableView.indexPathForRowAtPoint(location) else { return nil }
    guard let cell = tableView.cellForRowAtIndexPath(indexPath) else { return nil }
    guard let detailVC = storyboard?.instantiateViewControllerWithIdentifier("PostDetailViewController") as? PostDetailViewController else { return nil }

    let row = indexPath.row

    detailVC.post = self.posts[row]
    detailVC.preferredContentSize = CGSize(width: 0.0, height: 0.0)

    if #available(iOS 9.0, *) {
        previewingContext.sourceRect = cell.frame
    }

    return detailVC
}

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
    showViewController(viewControllerToCommit, sender: self)
}
ios 3dtouch
2个回答
1
投票

我已经经历了相同的情况,我在viewDidappear中执行了一些操作。并提出了以下解决方案。

我做的是在后台调用viewDidDissappear时将进程发送到睡眠状态0.3秒,当时调用函数previewingContext(previewingContext:UIViewControllerPreviewing,commitViewController viewControllerToCommit:UIViewController)我在那里调用singleton bool变量并赋值为true在viewDidDissappear中0.3秒后进入主线程并检查用户是否弹出的值

首先在Singleton类中声明一个Bool变量作为didPoppedByUser

然后在正在呈现的ViewController中

- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    sleep(0.3);
    dispatch_async(dispatch_get_main_queue(), ^{
        if!Singleton.sharedInstance.didPoppedByUser{
             [Singleton sharedInstance].didPoppedByUser = NO;
            //do your operations here
        }else{
            [Singleton sharedInstance].didPoppedByUser = NO;
        }
    });
});

}

在主ViewController中

-(void)previewingContext:(id )previewingContext commitViewController: (UIViewController *)viewControllerToCommit {

[Singleton sharedInstance].didPoppedByUser = YES;

//your operations

}

对于斯威夫特

func viewDidDisappear(animated:Bool){
super.viewDidDisappear(animated);
DispatchQueue.global(qos: .userInteractive).async {
    sleep(0.3);
    DispatchQueue.main.async {
        if Singleton.sharedInstance.didPoppedByUser == false{
            Singleton.sharedInstance.didPoppedByUser = false;
             //do your operations here
        }else{
            Singleton.sharedInstance.didPoppedByUser = false;
        }
    }
}

}

在主控制器中

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
Singleton.sharedInstance.didPoppedByUser = YES;
 //your operations

}

我不确定这样做是一个正确的编码,但它就像一个魅力。如果它适合你,它只是我最后接受的逻辑

谢谢


0
投票

尝试做类似的事情:

extension HomeViewController: PeekPopPreviewingDelegate {

    func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        //...
    }
    func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
      let detailViewController = viewControllerToCommit as! DetailViewController
      detailViewController.shouldPresentCompleteMode = true
      navigationController?.pushViewController(detailViewController, animated: true)
    }

}

class DetailViewController: UIViewController {

    var isPreviewMode = false

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if isPreviewMode {
            setupPreviewMode()
        } else {
            setupFullMode()
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.