0

我实现了一个排序设置面板与SWRevealViewController的,我试图传达给访问它的两个中的一个风险投资类混合起来的[NAV visibleViewController]

为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

此代码是自找麻烦:

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 
} 

注意我们是怎样投谁的类型,我们测试的对象,我们将它转​​换为类型,它正在测试为。

+0

对不起,我刚刚修复了错字,那些是VC1和VC2的名字lol – Jargen89 2014-09-05 18:25:26

+0

@ Jargen89 - 修复了两个问题之一,但代码仍然测试一个对象并且投射另一个对象。 – danh 2014-09-05 18:27:14

+0

但是我确实看到了我所犯的错误,谢谢! – Jargen89 2014-09-05 18:28:03