0

我使用 NSClassFromString 来分配视图控制器。但这不会让我为自己设置一个代表。是否可以?

nibString = @"ViewControllerName";
Class viewControllerClass = NSClassFromString( nibString );
loadedVC = (UIViewController*) [[viewControllerClass alloc] initWithNibName:nibString bundle:nil];
[loadedVC setDelegate:self];

最后一行报告 No visible@interface for "UIViewController" 声明选择器 'setDelegate'

我确信如果我通过属性分配 vc 它将起作用,但我使用这种方法是为了方便 - 尽管如果我可以将它设置为委托,我可能应该停止。

任何人都可以提出解决方案吗?

4

2 回答 2

2

我假设您已经这样声明loadedVC

UIViewController *loadedVC;

编译器只允许您向它发送它知道是UIViewController's的一部分的消息@interface。这是一件好事。它可以防止很多运行时错误。但有时你比编译器更清楚,你想关闭@interface检查。

当您尝试向 type 的值发送消息时id,编译器不会检查该消息,因为id它是一个没有 的泛型类型@interfaceloadedVC所以投到id

[(id)loadedVC setDelegate:self];

请注意,如果loadedVC没有(或继承)setDelegate:方法,您将收到运行时错误。如果你想先检查方法,试试这个:

if ([loadedVC respondsToSelector:@selector(setDelegate:)]) {
    [(id)loadedVC setDelegate:self];
}

另一种方法是创建一个包含setDelegate:方法的协议:

@protocol HasDelegate
- (void)setDelegate:(id)delegate;
@end

然后你可以loadedVC这样声明,告诉编译器它符合协议:

UIViewController<HasDelegate> *loadedVC;

现在,当您尝试发送setDelegate:loadedVC(即使没有演员表)时,编译器也不会抱怨。但是如果loadedVC实际上没有setDelegate:方法,您仍然会收到运行时错误。

于 2013-04-06T03:08:06.487 回答
1

UIViewControler 类没有委托属性。通常您将视图控制器设置为视图的委托,因此 setDelegate 将在视图上调用,而不是控制器。

如果您有一个支持委托的视图控制器子类,则编译器将看不到它,因为您加载的VC 引用已被强制转换为 UIViewControler。如果这是问题,有几种解决方案。

1)您可以强制转换为使用的类,或实现委托的第一个超类。

2)您可以使用正式或非正式的协议。

3) 可以调用respondsToSelector:,后跟performSelector:withObject:

等等

于 2013-04-06T02:58:29.390 回答