UINavigationController便于pop的category

效果图:

这个category是为了方便UINavigationController用于跳转到指定的控制器当中,用于跳级,如果pop的控制器不存在,会直接提示:

category源码:

UINavigationController+POP.h 与 UINavigationController+POP.m

//
//  UINavigationController+POP.h
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UINavigationController (POP)

- (NSArray *)popToViewControllerClass:(Class)viewControllerClass animated:(BOOL)animated;

@end
//
//  UINavigationController+POP.m
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "UINavigationController+POP.h"

@implementation UINavigationController (POP)

- (NSArray *)popToViewControllerClass:(Class)viewControllerClass animated:(BOOL)animated
{
    UIViewController *controller = nil;

for (UIViewController *oneController in self.viewControllers) {

if ([oneController isMemberOfClass:viewControllerClass]) {

controller = oneController;

break;

}

}

if (controller == nil) {
        NSLog(@"%s:%s:%d 要pop的控制器指针为空", __FILE__, __func__, __LINE__);
        return nil;
    }

    return [self popToViewController:controller
                            animated:animated];
}

@end

源码:

RootViewController.m

//
//  RootViewController.m
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "RootViewController.h"
#import "SecondViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 设置导航栏样式以及标题以及view的背景色
    [self titleTextAttributes:[self createTitleTextAttributes:[UIColor redColor]]];
    self.title = @"First ViewController";
    self.view.backgroundColor = [UIColor whiteColor];

    // 添加手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(tapEvent)];
    [self.view addGestureRecognizer:tap];
}

- (void)tapEvent
{
    [self.navigationController pushViewController:[SecondViewController new]
                                         animated:YES];
}

- (NCTitleAttribute *)createTitleTextAttributes:(UIColor *)color
{
    NCTitleAttribute *titleAttribute = [NCTitleAttribute new];
    titleAttribute.titleFont         = [UIFont fontWithName:@"HelveticaNeue-Thin" size:20.f];
    titleAttribute.titleColor        = color;

    return titleAttribute;
}

@end

SecondViewController.m

//
//  SecondViewController.m
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "SecondViewController.h"
#import "ThirdViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 设置导航栏样式以及标题
    [self titleTextAttributes:[self createTitleTextAttributes:[UIColor redColor]]];
    self.title = @"Second ViewController";
    self.view.backgroundColor = [UIColor redColor];

    // 添加手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(tapEvent)];
    [self.view addGestureRecognizer:tap];
}

- (void)tapEvent
{
    [self.navigationController pushViewController:[ThirdViewController new]
                                         animated:YES];
}

- (NCTitleAttribute *)createTitleTextAttributes:(UIColor *)color
{
    NCTitleAttribute *titleAttribute = [NCTitleAttribute new];
    titleAttribute.titleFont         = [UIFont fontWithName:@"HelveticaNeue-Thin" size:20.f];
    titleAttribute.titleColor        = color;

    return titleAttribute;
}

@end

ThirdViewController.m

//
//  ThirdViewController.m
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ThirdViewController.h"
#import "RootViewController.h"

@interface ThirdViewController ()

@end

@implementation ThirdViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 设置导航栏样式以及标题
    [self titleTextAttributes:[self createTitleTextAttributes:[UIColor redColor]]];
    self.title = @"Third ViewController";
    self.view.backgroundColor = [UIColor cyanColor];

    // 添加手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(tapEvent)];
    [self.view addGestureRecognizer:tap];
}

- (void)tapEvent
{
    [self.navigationController popToViewControllerClass:[RootViewController class]
                                               animated:YES];
}

- (NCTitleAttribute *)createTitleTextAttributes:(UIColor *)color
{
    NCTitleAttribute *titleAttribute = [NCTitleAttribute new];
    titleAttribute.titleFont         = [UIFont fontWithName:@"HelveticaNeue-Thin" size:20.f];
    titleAttribute.titleColor        = color;

    return titleAttribute;
}

@end

需要注意的一些地方:

时间: 2024-12-29 07:33:50

UINavigationController便于pop的category的相关文章

OC UINavigationController push pop自定义动画

1. DSLTransitionFromFirstToSecond #import <UIKit/UIKit.h> @interface DSLTransitionFromFirstToSecond : NSObject<UIViewControllerAnimatedTransitioning> /** isPresenting是否是pop动画, */ @property (nonatomic, assign) BOOL isPresenting; @end #import &q

UINavigationController 直接pop到指定controllerView的方法

//定义一个数组来接收所有导航控制器里的视图控制器 NSArray *controllers = self.navigationController.viewControllers; //根据索引号直接pop到指定视图 [self.navigationController popToViewController:[controllers objectAtIndex:1] animated:NO];

自己遇到的一些iOS面试题

1.OC内存管理机制 1).当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为 1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁. 2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它. 3).如果你保留了某个对象,你需要(最终)释

CollectionViewController 集合视图

 CollectionViewController 集合视图     UICollectionView, 继承于UIScollView, 可以滚动, 从iOS6才出现, 和UITableView的用法非常相似     tableView     dataSource: 显示数据     delegate: 样式和触发方法     collectionView     dataSource: 显示数据     delegate: 触发方法     UICollectionViewLayout: 样

iOS之2016面试题三

1.OC内存管理机制 1).当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为 1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁. 2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它. 3).如果你保留了某个对象,你需要(最终)释

Log4cpp介绍及使用

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能.使用log4cpp,能够非常便利地将日志或者跟踪调试信息写入字符流.内存字符串队列.文件.回滚文件.调试器.Windows日志.本地syslog和远程syslogserver中. 1.Log4cpp简单介绍 Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致.其类似的支持库还包含Java(log4j),C++(log4cpp.log4cplus),C(l

deleage 心得

iOS Delegate 的一些理解 转载2015-08-21 14:20:35 标签:delegateios开发iosdelegate 做 iOS 开发已经有段时间了,最近才意识到原来 Delegate 还有这样的坑.可能是之前对 Delegate 的理解还不够彻底吧. 现象 今天遇到一个 bug 场景是 :从 A 界面 Push到 B 界面,B 界面有遵守一个UITabBarControllerDelegate的Delegate.? 然后B 界面在 POP 回 A 界面.再点击界面上的 Ta

JVMS Specification(3)-The class File Format

Subsections 3 The class File Format 3.1 The ClassFile Structure 3.2 The Internal Form of Names 3.2.1 Binary Class and Interface Names 3.2.2 Unqualified Names 3.3 Descriptors and Signatures 3.3.1 Grammar Notation 3.3.2 Field Descriptors 3.3.3 Method D

自定义UINavigationController push和pop动画

http://segmentfault.com/q/1010000000143983 默认的UINavigationController push和pop的默认动画都是左右滑动推出,我的应用要求这种界面切换的动画效果复杂一点,大概有这么几个: 更快的左右推出,默认是0.3秒,我需要快一倍 带抖动的左右推出 水平翻转 纸张翻页效果 但是这些切换都要放在NavigationController里做管理,怎么实现,求个思路 ios 链接 评论 更多 默认排序时间排序 3 个回答 答案对人有帮助,有参考