iOS 13 使用按钮关闭模态页面 Sheet

iOS 13 Dismiss Modal Page Sheet with a button

所以我需要一些帮助来关闭 iOS 13 中的页面 sheet 模态屏幕。我查看了几篇帖子并且 none 提供了帮助。

查看第二个答案,我试过了,但我一直认为 self 是隐含的,需要明确。尝试对此进行研究,但没有发现太多。

我只想在导航栏的右上角有一个完成按钮。按下该按钮后,我需要它连接到数据库并保存数据(如果数据有效(已实现))。然后它需要关闭模态屏幕并刷新 table 以便它获得最新的更改。

我已经阅读了有关代表的内容,但没有太大帮助。我阅读了一些关于 UIAdaptivePresentationControllerDelegate 的内容,我了解它背后的基础知识并能够拉动以关闭模态。但不确定如何在按钮中复制它。我确实记得阅读以设置演示委托。或者类似的东西。

let navigationController = segue.destination as! UINavigationController
let editSensorVC = navigationController.topViewController as! EditSensorViewController

navigationController.presentationController?.delegate = editSensorVC

据说这是我设置委托的方式,但不确定从这里去哪里。

在这里,这就是你如何做到的 objective-c 在呈现 viewcontroller 中实际上没有呈现任何东西,但它是导航控制器。这是简单模式。

UIViewController *pvc = [UIViewController new];
WLGNavigationController *nav = [[WLGNavigationController alloc] initWithRootViewController:pvc];
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(backerPressed)];
[[pvc navigationItem] setLeftBarButtonItem:backBarButtonItem];
[[self navigationController] presentViewController:nav animated:true completion:nil];

支持者是这样的:

- (void)backerPressed {
  [[self navigationController] dismissViewControllerAnimated:true completion:nil];
}

硬模式:

完成处理程序:

向您呈现的 VC 添加一个完成处理程序,然后在您呈现的 VC 中添加导航按钮,然后添加一个操作,当按下该按钮时,您 运行 承诺完成后的完成处理程序。然后在呈现的视图控制器中,设置完成处理代码以关闭呈现的 navigation/view 控制器组合。

代表团:

在你展示的 VC 中写一个委托,当承诺 returns 时,执行委托方法,"responds to selector" blah blah,就像你通常对委托所做的那样.在呈现 VC 中,您然后将其设为您正在呈现的 VC 的委托,实现在调用时调用导航控制器以关闭其呈现的 navigation/view 控制器包的方法。

如果原始 VC 是 PresentingVC 类型,而模态是 PresentedVC 类型,我将使用以下方法。鉴于上面的 segue 语句,我假设您正在使用故事板,但如果不替换 prepare(for segue:) ,则在实例化 PresentedVC

时注入委托值

首先,通过定义委托协议并提供委托 属性,将您的 PresentedVC 设置为持有委托 属性。


protocol PresentedVCDelegate {
   func presentedVCDidUpdateDatabase()
}

class PresentedVC {
    var delegate: PresentedVCDelegate?

    @IBAction buttontapped(_ sender: Any) {
        //existing code to validate and save data to databse
        delegate?. presentedVCDidUpdateDatabase()
        dismiss(animated: true)
    }
}

更新 PresentingVC 以便它在实例化其子项时将自身作为委托注入 VC:

class PresentingVC {

    //all the current code

    // and amend preapre(for:) something like
    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      // Get the new view controller.
       if let presented = segue.destination as? PresentedVC {
          presented.delegate = self
          //anything else you do already
       }
    }
}

扩展它以支持协议方法

extension PresentingVC: PresentedVCDelegate {
    func presentedVCDidUpdateDatabase() {
        tableView.reloadData()
        //any other work necessary after PresentedVC exits
    }
}

注意:凭记忆写的,没有编译,所以可能包含一些小错别字,但希望它足够详细来理解这个概念?