Доступ к свойствам родительского представления (пользовательские)
Я написал подкласс 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
решит проблему.