【问题标题】:iOS 13 Dismiss Modal Page Sheet with a buttoniOS 13 使用按钮关闭模态页面表
【发布时间】:2020-02-19 10:14:29
【问题描述】:

所以我需要一些帮助来消除 iOS 13 中的页面模式屏幕。我查看了几篇帖子,但没有任何帮助。

iOS 13 Modals - Calling swipe dismissal programmatically

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

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

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

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

navigationController.presentationController?.delegate = editSensorVC

有人说这是我设置委托的方式,但不知道从哪里开始。

【问题讨论】:

  • 努力将标题与问题的文本联系起来。关闭模型很简单,只需将操作链接到按钮(通过 IBAction 或 .addTarget),该按钮运行必要的代码,然后调用 `dismiss(amimated:)。为简单起见,取决于父视图控制器是否可以通过 viewWillAppear() 刷新,您甚至可能不需要委托。您能否为您的问题添加更多细节 - 模式和父视图控制器类(仅具有相关属性/方法)会非常有帮助。
  • 从我阅读的内容来看,因为我在 iOS 13 中使用了新的页面表,所以我无法使用 viewWillAppear()。我连接了一个 IBAction,我确实调用了dismiss(animated:),除了更新父视图中的表之外,一切都按我需要的方式工作。我会尝试改写的东西。

标签: ios swift ios13 modalviewcontroller dismiss


【解决方案1】:

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

时注入委托值

首先,通过定义委托协议并提供委托属性,将 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
    }
}

注意:从内存中编写,未编译,因此可能包含轻微的拼写错误,但希望它足够详细,可以理解这个概念?

【讨论】:

  • 所以稍作修改后,我就可以使用它了。事实证明,重新加载表格实际上并没有做我需要做的事情,但我也设法解决了这个问题。您的代码中也确实存在错误。扩展中的最后一个括号是向后的。除此之外没有错误。再次感谢,这是一个巨大的帮助。现在继续下一期。
【解决方案2】:

在这里,这就是您在呈现视图控制器中的objective-c 执行方式,它实际上并没有呈现任何东西,但它是navigationcontroller。这是简单模式。

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 中,添加导航按钮,然后添加一个操作,当按下该操作时,您会在 promise 完成后运行该完成处理程序。然后在呈现视图控制器中,设置完成处理代码,然后关闭呈现的导航/视图控制器组合。

代表团:

在您呈现的 VC 中编写一个委托,当承诺返回时,执行委托方法,“响应选择器”等等,就像您通常对委托所做的那样。然后,在呈现的 VC 中,您将其设置为您正在呈现的 VC 的委托,实现调用导航控制器以关闭其呈现的导航/视图控制器包的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多