Objective-C:使用 self.navigationController 和自定义 UINavigationController

Posted

技术标签:

【中文标题】Objective-C:使用 self.navigationController 和自定义 UINavigationController【英文标题】:Objective-C: Using self.navigationController with a Custom UINavigationController 【发布时间】:2012-06-22 14:43:59 【问题描述】:

我创建了一个自定义导航控制器,我称之为CatalogueNavigationController。这个CatalogueNavigationController 有一个名为currentLevel 的属性,它的类型是int

在此导航控制器中显示的我的一个视图控制器上,我想获得CatalogueNavigationControllercurrentLevel 值。但是,当我尝试使用 self.navigationController.currentLevel 引用它时,我遇到了一个错误,提示 currentLevel 不是 UINavigationController 的属性 - 我知道,它是 CatalogueNavigationController 的一部分。

目录导航控制器

// .h
@interface CatalogueNavigationController : UINavigationController
@property int currentLevel;

// .m
@implementation CatalogueNavigationController
@synthesize currentLevel;

初始化视图控制器

CatalogueBrowser *catalogue = [[CatalogueBrowser alloc] initWithStyle:UITableViewStyleGrouped andQuery:nil];
CatalogueNavigationController *navigation = [[CatalogueNavigationController alloc] initWithRootViewController:catalogue];
navigation.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:navigation animated:YES];

目录浏览器视图控制器

NSLog(@"%i",self.navigationController.currentLevel); //ERROR: Property 'currentLevel' not found on object of type 'UINavigationController *'

currentLevel 变量在 viewController 弹出时递减,而在 viewController 被推送时递增,以允许我跟踪用户导航的“深度”。所以我需要返回它的当前状态。

我可以使用通知来结合我的视图控制器和 CatalogueNavigationController 上的变量,但肯定有更优雅的解决方案吗?

如何引用 self.navigationController 以返回 currentLevel 的值,但让它引用 CatalogueNavigationController 而不是 UINavigationController?

【问题讨论】:

【参考方案1】:

我认为最好的解决方案是测试 navigationController 是否属于您想要的类型,这里解释为:In Objective-C, how do I test the object type?。如果它是真的,你将它转换为你的对象,然后检查你想要的值。

铸造对象信息:ios custom NSObject casting.

希望对你有帮助!

【讨论】:

为此干杯,但以这种方式进行转换将始终检索初始化版本,而不是当前实例。在我的 CatalogueNavigationController 中,我递增/递减 NSLog 正确输出的 currentLevel,使用此方法,它始终返回 0。【参考方案2】:

我偶然发现了同样的情况。我认为解决方案是这样的:

CatalogueNavigationController *navController = (CatalogueNavigationController *)self.navigationcontroller;

NSLog(@"%i", navController.currentLevel);

【讨论】:

以上是关于Objective-C:使用 self.navigationController 和自定义 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 使用 C++类

使用Objective-C时的基本输入和输出是啥[关闭]

如何在c++中,调用objective-c

在 Objective-C 中使用异常

[精通Objective-C]内存管理

在objective-c中使用swift代码时的问题