Objective-C: использование self.navigationController с настраиваемым UINavigationController

Я создал настраиваемый контроллер навигации, который назвал CatalogueNavigationController. Этот CatalogueNavigationController имеет свойство под названием currentLevel, которое относится к типу int.

На одном из моих контроллеров представления, которые представлены в этом контроллере навигации, я хотел бы получить значение currentLevel CatalogueNavigationController. Однако, когда я пытаюсь сослаться на него с помощью self.navigationController.currentLevel, я сталкиваюсь с ошибкой, которая предполагает, что currentLevel не является свойством UINavigationController - я знаю, что это часть CatalogueNavigationController.

КаталогНавигацияКонтроллер

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

// .m
@implementation CatalogueNavigationController
@synthesize currentLevel;

Инициализация View Controller

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?


person Dan Hanly    schedule 22.06.2012    source источник


Ответы (2)


Я думаю, что лучшее решение - проверить, имеет ли navigationController тот тип, который вам нужен, здесь объясняется: Как проверить тип объекта в Objective-C?. И если это правда, вы приводите его к своему объекту, а затем проверяете желаемое значение.

Информация о преобразовании объектов: кастомное преобразование NSObject для ios.

Надеюсь, поможет!

person LFCPirex    schedule 22.06.2012
comment
Приветствую вас, но при таком приведении всегда будет извлекаться инициализированная версия, а не текущий экземпляр. В моем CatalogueNavigationController я увеличиваю / уменьшаю currentLevel, который NSLog выводит правильно, с помощью этого метода он всегда возвращает 0. - person Dan Hanly; 22.06.2012

Я наткнулся на такую ​​же ситуацию. Думаю, решение вот в чем:

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

NSLog(@"%i", navController.currentLevel);
person Tuslareb    schedule 11.03.2014