【问题标题】:Dynamically load ViewController from TableView Row Selection从 TableView 行选择中动态加载 ViewController
【发布时间】: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

在使用固定的视图控制器值进行测试时,我得到了正常工作的条件......请提供任何建议!

【问题讨论】:

    标签: iphone cocoa-touch uitableview uikit uiviewcontroller


    【解决方案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 声明为持有一个指向确实具有这些属性的对象的指针。由于您要存储一个指向两个不同类之一的实例的指针(我假设两个类都声明它们的实例具有这些属性),因此有两种解决方案:

    1. 创建一个声明这两个属性的协议,并使 FirstViewController 和 SecondViewController 都声明符合该协议,并将该变量声明为持有一个指向符合该协议的对象的指针。
    2. 创建一个 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多