gpt4 book ai didi

ios - [nav visibleViewController] 的类混合

转载 作者:行者123 更新时间:2023-11-29 02:41:42 26 4
gpt4 key购买 nike

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

VC2 的导航路径需要从 VC1 开始

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 来解决这个问题,所以我只是请求大家放心。为什么会发生这种情况?

编辑:我是个白痴哈哈

最佳答案

这段代码是自找麻烦:

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。

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

类型自省(introspection)的安全模式是这样的:

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

请注意我们如何转换对象 who 是我们测试的类型,以及我们如何将它转换为它被测试的类型。

关于ios - [nav visibleViewController] 的类混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com