我正在努力解决我的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)
}
我已经经历了相同的情况,我在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
}
我不确定这样做是一个正确的编码,但它就像一个魅力。如果它适合你,它只是我最后接受的逻辑
谢谢
尝试做类似的事情:
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()
}
}
}