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