从TableView行选择动态加载ViewController

时间:2010-09-12 16:14:23

标签: iphone cocoa-touch uitableview uikit uiviewcontroller

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值进行测试时,我正在使条件正常工作......请提出任何建议!

2 个答案:

答案 0 :(得分: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子类,并将该变量声明为持有指向抽象子类实例的指针。
  3. 我可能会做后者,并将您当前在First和SecondViewController之间复制粘贴的任何内容移动到抽象类中。

答案 1 :(得分:0)

添加

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

后:

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

可能不是你的想法。