我已经使用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来解决这个问题,所以我只是要求一点心思。为什么会这样?
编辑:我是个白痴哈哈
答案 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
}
请注意我们如何投射我们测试过的类型的对象,以及我们将其转换为测试类型的对象。