Динамически загружать ViewController из TableView Row Selection - PullRequest
0 голосов
/ 12 сентября 2010
UIViewController *viewVC = nil;
NSString *TcodeNib = [selectedObject valueForKey:@"ViewControllerName"];
// Create the next-level view controller 
if ([TcodeNib isEqualToString:@"FirstViewController"]) {
    viewVC = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
} else if ([TcodeNib isEqualToString:@"SecondViewController"]) {
    viewVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
}
viewVC.referringObject = [selectedObject managedObjectContext];
viewVC.referringTransaction = referringObject;

Однако, я получаю сообщение об ошибке при компиляции кода:

request for member 'referringObject' in something not a structure or union

Я получаю условия для правильной работы при тестировании с фиксированным значением viewcontroller ... Любой совет, пожалуйста!1005 *

Ответы [ 2 ]

4 голосов
/ 13 сентября 2010
UIViewController *viewVC = nil;
[blah blah blah]
viewVC.referringObject = [selectedObject managedObjectContext];
viewVC.referringTransaction = referringObject;

Тем не менее, я получаю сообщение об ошибке при компиляции кода как:

request for member 'referringObject' in something not a structure or union

Это потому, что UIViewController не имеет свойства referringObject. (Попробуйте скомпилировать с помощью Clang вместо GCC; возможно, оно даст вам более четкое сообщение об ошибке.) У него также нет свойства referringTransaction, поэтому, если вы вырежете первое назначение, вы получите похожую ошибку для второй.

Вы объявили viewVC как указатель на UIViewController, так что это все, что знает компилятор: viewVC будет содержать либо nil, либо указатель на UIViewController. Он не предполагает ничего о том, какие подклассы UIViewController вы можете создавать. Вы сказали, что этот объект является UIViewController, поэтому вы не можете назначить эти свойства этого объекта, потому что у UIViewController их нет.

Вам необходимо объявить viewVC как указатель на объект, который имеет с этими свойствами. Поскольку вы собираетесь хранить указатель на экземпляр одного из двух разных классов (я предполагаю, что оба класса объявляют, что их экземпляры имеют эти свойства), существует два решения:

  1. Создайте протокол, который объявляет два свойства, и заставьте FirstViewController и SecondViewController объявлять соответствие этому протоколу и объявить переменную как содержащую указатель на объект, который соответствует этому протоколу.
  2. Создание абстрактного подкласса UIViewController, который объявляет и реализует два свойства, и создание подклассов FirstViewController и SecondViewController абстрактного подкласса, и объявление переменной как содержащей указатель на экземпляр абстрактного подкласса.

Вероятно, я бы сделал последнее и переместил бы все, что вы сейчас скопировали и вставили между First и SecondViewController, в абстрактный класс.

0 голосов
/ 12 сентября 2010

Добавить

NSLog(@"Value of TcodeNib: %@",TcodeNib);

после:

NSString *TcodeNib = [selectedObject valueForKey:@"ViewControllerName"];

Возможно, это не то, что вы думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...