IOS:后退两个视图

Posted

技术标签:

【中文标题】IOS:后退两个视图【英文标题】:IOS: Move back two views 【发布时间】:2013-01-09 20:11:23 【问题描述】:

我已经被这个问题困扰了一段时间,找不到任何有用的信息来说明如何做到这一点..

我有一个基本视图(视图 1),我可以在其中选择表格视图中的项目。在项目“页面”(视图 2)上,我可以选择编辑该项目,触发模态视图(视图 3)。 在这个模态视图中,我可以选择删除这个项目。如果用户按下该按钮并确认他们要删除该项目,我想将应用程序发送回视图 1..

我尝试了很多不同的方法(popToViewControllerpushViewControllerdismissViewController 等等),但我什么都做不了。如果我关闭模式,则视图 2 不会关闭。有时甚至模态也不会消失。基本视图是UITableViewController,另外两个是UIViewControllers,我使用的是storyboard

【问题讨论】:

如何推送视图?你用导航控制器吗? 【参考方案1】:

您有几个选项可以使用NSNotificationCenter 或delegate 模式。 NSNotificationCenter 好用,但也很棘手。

要使用通知中心,您需要向视图控制器类添加观察者。当您关闭模态视图控制器时,您会通知视图 2 视图 3 现在已关闭,view2 可以自行关闭.....

所以基本上当你通知中心时,无论通知什么,它都会运行一个方法等等......

假设您在视图 3 中,您想要忽略您的视图。

在view3.m中

-(IBAction)yourMethodHere

        //dissmiss view
        [self.navigationController dismissModalViewControllerAnimated:YES];
         // or [self dismissModalViewControllerAnimated:YES]; whateever works for you 

        //send notification to parent controller and start chain reaction of poping views
        [[NSNotificationCenter defaultCenter] postNotificationName:@"goToView2" object:nil];

在视图 2 中。 h

// For name of notification
extern NSString * const NOTIF_LoggingOut_Settings;

@implementation 之前#imports#imports 之前的视图 2.m

NSString * const NOTIF_LoggingOut_Settings = @"goToView2";

    @implementation
    -(void)viewDidAppear:(BOOL)animated

        // Register observer to be called when logging out
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(loggingOutSettings:)
                                                     name:NOTIF_LoggingOut_Settings object:nil];
    
    /*---------------------------------------------------------------------------
     * Notifications of 2 view
     *--------------------------------------------------------------------------*/
    - (void)loggingOutSettings:(NSNotification *)notif
    
        NSLog(@"Received Notification - Settings Pop Over  popped");

        [self.navigationController popViewControllerAnimated:NO];// change this if you do not have navigation controller 

//call another notification to go to view 1 
        [[NSNotificationCenter defaultCenter] postNotificationName:@"goToFirstView" object:nil];
    

在您的第一个视图中添加另一个观察者 在你看来1.h extern NSString * const NOTIF_FirstView;

@implementation之前的视图1.m之后#imports

NSString * const NOTIF_FirstView = @"goToFirstView";

@implementation
-(void)viewDidAppear:(BOOL)animated

    // Register observer to be called when logging out
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(doYourThing:)
                                                 name:NOTIF_FirstView object:nil];

/*---------------------------------------------------------------------------
 * Notifications of 1 view
 *--------------------------------------------------------------------------*/
- (void)ldoYourThing:(NSNotification *)notif



 // do your thing

【讨论】:

很好的解释,谢谢!但是 - 我无法让第二个视图走出屏幕。模态消失,然后触发视图的 NSLog 输出,然后触发我放入 view1 viewDidAppear 的 NSLog。所以它顺其自然,第二个屏幕没有被删除.. 这个[self.navigationController popViewControllerAnimated:NO]方法在你有导航控制器时有效,确保使用适合你的代码的正确方法,似乎通知工作正常你只需要改变你的dismiss方法 还有哪些其他方法可以关闭视图?如果 popViewController 不起作用,那是什么问题呢?我是一个初学者开发者.. 弹出视图控制器仅在您提前将视图推送到堆栈时才起作用。我不知道可能的问题,因为您的问题中没有代码示例或故事板屏幕截图 我通过 [self.navigationController popToViewController:senderClass animated:NO]; 解决了这个问题,其中 senderClass 只是从父类发送到自身的引用。非常感谢您的帮助!

以上是关于IOS:后退两个视图的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 13 上推送新视图后后退按钮崩溃

IOS应用导航栏后退按钮

Ios 导航 - 自定义后退按钮或从堆栈中删除视图控制器?

iOS 8 在初始视图中导致奇怪的后退框

ios,如何在 Collection 视图中执行 (interactivePopGestureRecognizer) 后退操作

在 iOS 7 上的导航视图控制器上使用后退手势时,表格视图单元格上没有淡出和淡入动画