Доступ к свойствам родительского представления (пользовательские)

Я написал подкласс UITabBarController (называемый MainViewController) и добавил несколько переменных экземпляра, в частности место проведения типа Venue. Каждая вкладка MainViewController должна получить доступ к переменной места размещения MainViewController. На первой вкладке подклассом UIViewController с именем HomeViewController я написал свой метод viewDidLoad и попытался выполнить вывод в NSLog с обоими...

NSLog(@"%@", self.parentViewController.venue.name);

и

NSLog(@"%@", self.tabBarController.venue.name);

Но XCode выдает ошибку

error: request for member 'venue' in something not a structure or union

Я могу получить доступ к свойству места проведения из MainViewController только в порядке, чтобы исключить ошибку. Симулятор iPhone видит как self.parentViewController, так и self.tabBarController как экземпляр MainViewController. Линия...

NSLog(@"%@", self.tabBarController);

выходы...

2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600>

Поскольку он рассматривается как экземпляр MainViewController, я сомневаюсь, что использование кастинга поможет. Моя единственная другая возможность инициализировать HomeViewController с копией места встречи, или я просто делаю что-то совершенно неправильное с 'self.parentViewController.venue.name'? Спасибо, Роб.

Ответ 1

Ты делаешь что-то совершенно неправильное. parentViewController объявляется как UIViewController. NSLog В результате он выводит свой реальный тип из-за чудеса полиморфизма.

UIViewController не имеет члена Venue. Ваш MainViewController делает. Кастинг это, по сути, правильный ответ. Обязательно импортируйте MainViewController.h.

#import "MainViewController.h"
[...]
NSString *name = ((MainViewController *)self.parentViewController)).venue.name;

Также убедитесь, что Venue объявлен как @property MainViewController, а name - @property из Venue.

Ответ 2

int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];

//previous view controller
AccountViewController *account = (AccountViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1];

account.property = object;
[account doSmthng];

Ответ 3

Ваш оператор NSLog() "видит" его как MainViewController, потому что это то, что на самом деле является объектом. Проблема, с которой вы сталкиваетесь, заключается в том, что компилятор на самом деле не понимает этого, потому что свойство parentViewController объявлено как простой старый UIViewController. Даже несмотря на то, что вы фактически возвращаете подкласс, поскольку компилятор знает, что вы пытаетесь вызвать этот метод на UIViewController, и он собирается жаловаться. Передача его в MainViewController решит проблему.