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
}
}
注意:凭记忆写的,没有编译,所以可能包含一些小错别字,但希望它足够详细来理解这个概念?
所以我需要一些帮助来关闭 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
}
}
注意:凭记忆写的,没有编译,所以可能包含一些小错别字,但希望它足够详细来理解这个概念?