2010-09-12 3 views
0
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; 

Однако я получаю сообщение об ошибке при компиляции кода, как:Динамически загрузить ViewController от выбора TableView Row

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

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

ответ

4
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

Спасибо, Питер, это именно то, о чем я не думал. Я также внедрил код путем подкласса UiViewcontroller в соответствии с вашей точкой 2, и он отлично работает. Спасибо за помощь. – Accilies

0

Добавить

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

после:

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

Это может быть не то, что вы думаете.

+0

Это поможет только диагностировать проблему во время выполнения; он ничего не скажет допрашивающему о ошибке компилятора. –

+0

Спасибо за ответ Joran, но я получаю значение как ожидалось 2010-09-13 04: 09: 03.660 ApplicationDemo [6613: 207] Значение TcodeNib: UserLookup – Accilies

Смежные вопросы