iOS 扩展 UINavigationController 出栈返回到先前标记的位置

iOS 扩展 UINavigationController 出栈返回到先前标记的位置

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



这一功能,是突然想到去年看一个 Java 什么数据结构的原码时留下的印象,那里面就是一顿 mark,留标记,。。。都忘了

可是留下了莫名的火花儿,咱也不知道这是哪儿跟哪儿,就联系上了,

不过确实,就是那一瞬间脑袋里浮现了一下下那个 mark,才想起这样做的,无厘头哉?非也!

直接上代码,后附使用说明:


MarkNavigationController.h

#import <UIKit/UIKit.h>

@interface MarkNavigationController : UINavigationController

@property (nonatomic, strong) NSMutableArray *markControllers;
@property (nonatomic, weak) UIViewController *lastMarkController;

- (void)popToMarkViewControllerAnimated:(BOOL)animated;
- (void)mark;

@end


MarkNavigationController.m

#import "MarkNavigationController.h"

@interface MarkNavigationController ()

@end

@implementation MarkNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.markControllers = [[NSMutableArray alloc] init];
}


#pragma mark - 

- (void)popToMarkViewControllerAnimated:(BOOL)animated {
    
    if (self.markControllers.count > 0) {
        
        [self.markControllers removeObject:self.lastMarkController];
        [self popToViewController:self.lastMarkController animated:YES];
        
        if (self.markControllers.count > 0) {
            
            self.lastMarkController = self.markControllers.lastObject;
        }
        else {
            
            self.lastMarkController = nil;
        }        
    }
}

// 必须与上一方法匹配使用,避勉内存泄漏
- (void)mark {
    
    self.lastMarkController = self.viewControllers.lastObject;
    [self.markControllers removeObject:self.lastMarkController];
    [self.markControllers addObject:self.lastMarkController];
}

@end

在 push 前,先调用 mark,将当前视图控制器标记为最后一个出栈返回点,

之后无论 push 多少视图控制器到栈中,调用 - (void)popToMarkViewControllerAnimated:(BOOL)animated; 时,会自动出栈视图控制器直到最后标记的控制器。

实际上就是给导航控制器加了一个存储而已。


压栈前标记:

#pragma mark - NavigationBarButtonDelegate

- (void)leftBarButtonPressed:(id)sender {
    
    NSLog(@"leftBarButtonPressed");
    
    [self mark];
    [self performSegueWithIdentifier:@"SegueToGetClassCode" sender:sender];
}

出栈返回到最后标记位置:

#pragma mark -

- (IBAction)popToMarkButtonPressed:(id)sender {
    
    [self popToMarkViewControllerAnimated:YES];
}





你可能感兴趣的:(iOS 扩展 UINavigationController 出栈返回到先前标记的位置)