从 TableView 行选择中动态加载 ViewController
Posted
技术标签:
【中文标题】从 TableView 行选择中动态加载 ViewController【英文标题】:Dynamically load ViewController from TableView Row Selection 【发布时间】:2010-09-12 16:14:23 【问题描述】: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
在使用固定的视图控制器值进行测试时,我得到了正常工作的条件......请提供任何建议!
【问题讨论】:
【参考方案1】: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
声明为持有一个指向确实具有这些属性的对象的指针。由于您要存储一个指向两个不同类之一的实例的指针(我假设两个类都声明它们的实例具有这些属性),因此有两种解决方案:
-
创建一个声明这两个属性的协议,并使 FirstViewController 和 SecondViewController 都声明符合该协议,并将该变量声明为持有一个指向符合该协议的对象的指针。
创建一个 UIViewController 的抽象子类,声明并实现这两个属性,并创建抽象子类的 FirstViewController 和 SecondViewController 子类,并将变量声明为持有指向抽象子类实例的指针。
我可能会做后者,并将您当前在 First 和 SecondViewController 之间复制和粘贴的任何其他内容也移动到抽象类中。
【讨论】:
谢谢彼得,这正是我没有想到的。我也根据您的第 2 点通过子类化 UiViewcontroller 来实现代码,并且效果很好。感谢您的帮助。【参考方案2】:添加
NSLog(@"Value of TcodeNib: %@",TcodeNib);
之后:
NSString *TcodeNib = [selectedObject valueForKey:@"ViewControllerName"];
可能不是你想的那样。
【讨论】:
这只会帮助在运行时诊断问题;它不会告诉提问者有关编译器错误的任何信息。 感谢 Joran 的回复,但我得到的值符合预期 2010-09-13 04:09:03.660 ApplicationDemo[6613:207] TcodeNib 的值:UserLookup以上是关于从 TableView 行选择中动态加载 ViewController的主要内容,如果未能解决你的问题,请参考以下文章