[nav visibleViewController]的类混淆

时间:2014-09-05 18:01:57

标签: ios class uiviewcontroller uinavigationcontroller uitabbarcontroller

我已经使用SWRevealViewController实现了一种设置面板,我正在尝试与两个访问它的VC之一进行通信

VC2的导航路径需要来自VC1的segue

UITabBarController *tabBar = (UITabBarController*)[self.revealViewController frontViewController];
UINavigationController *nav = [[tabBar viewControllers] objectAtIndex:0];
NSLog(@"Being sent to a %@",NSStringFromClass([[nav visibleViewController] class]));
if([[nav visibleViewController] isKindOfClass:[VC1 class]]){
    VC1 *view = (VC1 *)[[nav viewControllers] objectAtIndex:0];
    [view setUrlString:typeOfSearch];
    [view startSearchOver];
}else if( [[nav visibleViewController] isKindOfClass:[VC2 class]]){
    VC2 *view = (VC2 *)[[nav viewControllers] objectAtIndex:0];
    [view setUrlString:typeOfSearch];
    [view refreshRequest];
}

我正在尝试与VC2沟通。在测试VC类时,控制台打印出VC2,但是当我运行[VC2 refreshRequest]时,应用程序崩溃,这就是我在控制台中看到的。

[VC1 refreshRequest]: unrecognized selector sent to instance 0x175b4a20

我已经决定使用NSUserDefaults来解决这个问题,所以我只是要求一点心思。为什么会这样?

编辑:我是个白痴哈哈

1 个答案:

答案 0 :(得分:1)

此代码遇到麻烦:

if([[nav visibleViewController] isKindOfClass:[VC1 class]]){
    VC1 *view = (EventSearchView *)[[nav viewControllers] objectAtIndex:0];

它测试[nav visibleViewController]是否是VC1,然后忽略它刚才学到的东西,它将其他对象[[nav viewControllers] objectAtIndex:0]转换为其他类型(EventSearchView)。所以有两个错误:(1)测试一个对象并抛出另一个对象,(2)测试一个对象为TypeA,然后再作为TypeB进行转换。

我们对条件中第二个对象的类一无所知。随着运行时的崩溃,我们了解到它并不是我们认为的。

类型内省的安全模式是:

id instanceOfUnknownClass = // whatever
if ([instanceOfUnknownClass isKindOfClass:[SomeClass self]]) {
    SomeClass *nowWeKnow = (SomeClass *) instanceOfUnknownClass;
    // safely message nowWeKnow according to SomeClass's interface
}

请注意我们如何投射我们测试过的类型的对象,以及我们将其转换为测试类型的对象。