从 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的主要内容,如果未能解决你的问题,请参考以下文章

如何动态调整tableheaderview的高度

选择行后Tableview不会重新加载数据

如何优化tableView的使用?

在 Tableview 中为先前选择的行加载复选标记(已批准的用户)

从列表中选择并重新加载 Tableview Swift

如何在ios中创建没有tableview和collection view的行