【问题标题】:How can I pop a modal view and the previous navigation controller view at once?如何一次弹出模态视图和前一个导航控制器视图?
【发布时间】:2011-12-27 20:22:40
【问题描述】:

我想同时弹出一个模态视图和上一个视图。例如,查看日历应用程序。当我在Edit 屏幕上并选择Delete Event 时,我将返回日历视图。

弹出以模态方式呈现的Edit 屏幕以及Event 屏幕(用户只是在其中查看日历事件)。我遇到的问题是我知道如何弹出模态视图,但来自同一个 UIViewController 子类(本例中为 Edit 屏幕)。

如何弹出非模态视图?

我正在考虑像往常一样弹出模态视图,然后将 NSNotification 发布到“Event”(例如)屏幕的 UIViewController 子类,并告诉它也弹出该视图。

另外,对于动画来说,应该是dismissModalViewControllerAnimated 动画(向下滑动)而不是popViewControllerAnimated 动画(向左滑动)。

在寻找更好的解决方案时,我找到了this,这在我的情况下不起作用(至少不适用于popViewControllerAnimated

【问题讨论】:

  • 更新:发送NSNotification 也不起作用。为了进一步剖析这个问题,我在“View”屏幕上抓取了视图控制器数组,如下所示:NSLog(@"received notification");[self.navigationController popViewControllerAnimated:YES];NSArray *controllers = [self.navigationController viewControllers];for (UIViewController *c in controllers) {`NSLog(@"%@",[c title]) ;` }

标签: ios iphone uinavigationcontroller modalviewcontroller


【解决方案1】:

您需要使用委托模式来通知模态“父级”它应该关闭模态视图控制器(动画:否)并将自己从堆栈中弹出(动画:是)。

这正是日历应用程序上发生的情况 - 只需注意确认事件删除时导航栏标题发生的情况 - 您可以看到标题快速从“编辑”变为“事件详细信息”作为该视图正在从导航堆栈中弹出。

所以简而言之,如果我们谈论的是日历应用程序,在您的模态视图控制器中,使用类似 didConfirmEventDeletion 的方法创建一个协议:

@protocol ModalViewDelegate <NSObject>
- (void)didConfirmEventDeletion;
@end

@interface ModalViewController...

@property (nonatomic, assign) id<ModalViewDelegate> delegate;

@end     

及实施:

@implementation ModalViewController

- (void)deleteEventMethod
{
    ...
    if ([self.delegate respondsToSelector:@selector(didConfirmEventDeletion)])
         [self.delegate didConfirmEventDeletion];
}

然后在您的父视图控制器中,将自己声明为模态的委托并实现didConfirmEventDeletion

- (void)didConfirmEventDeletion
{
    [self dismissModalViewControllerAnimated:NO];
    [self.navigationController popViewControllerAnimated:YES];
}

PS:我写这段代码时可能有一些拼写错误...

【讨论】:

  • 谢谢。它在我最终删除了一个名为 navigationController 的属性后起作用,该属性是在您调用 [self.navigationController pushViewController:someView...] 时从上一个视图传递的;有了这个属性,导航控制器一到达“事件”屏幕就为零。因此它不能从导航控制器堆栈中弹出。但是,我认为我们对视图转换应该是什么有不同的想法。当我删除(日历)事件时,动画会向下滑动。当我在我的项目中这样做时,它是向右滑动的。
  • 如果我改变反转动画; YES 模式和 NO 弹出(或在模式/导航动画上执行任何其他 YES/NO 组合),应用程序崩溃......:/可能是因为第二个视图必须是带有动画的视图。我现在只是猜测 D:
  • - (void)dismissModalViewControllerAnimated:(BOOL)animated 已弃用。文档说Use dismissViewControllerAnimated:completion: instead.
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多