2013-10-15 36 views
1

基本上,我有以下兩種方法推送相同的調用視圖控制器_vcCall。 pushViewController在on_calling方法下工作正常,但不在on_incoming_call下工作。我相信self.navigationController不是null,_vcCall也不爲null。我已經在兩種方法中打印出navigationController和_vcCall,並且它們都具有相同的地址。我甚至試圖在on_incoming_call中創建一個新的viewcontroller,但它仍然不起作用。self.navigationController不爲null,但pushViewController不工作

我在屏幕上只有一個按鈕,當它被點擊時,它會向通話視圖控制器推送。當on_calling方法被觸發時,它會成功推入_vcCall,但是當on_incoming_call被觸發時,它什麼都不做,但阻止我點擊Call按鈕。似乎在當前視圖控制器上有一個透明頁面被推送。

enter image description here

有人可以幫助嗎?

- (void)viewDidLoad { 
    _vcCall = [[CallViewController alloc] init]; 
} 

- (void) sipConnection: (SIPConnection *) connection on_calling: (NSDictionary *) userInfo  { 
    NSLog(@"on_calling: navi: %@", self.navigationController); 
    [self.navigationController pushViewController:_vcCall animated:YES]; 
} 

- (void)sipConnection:(SIPConnection *)connection on_incoming_call:(NSDictionary *)userInfo { 
    NSLog(@"on_incoming_call: navi: %@", self.navigationController); 
    [self.navigationController pushViewController:_vcCall animated:YES]; 
} 

這是在控制檯輸出的時候on_calling被觸發第一

on_calling: navi: <navViewController: 0x77779d0> 
on_incoming_call: navi: <navViewController: 0x77779d0> 

以下部分,其中委託方法被稱爲

- (void) processCallMediaState: (NSDictionary *) userInfo { 
    int state = [[userInfo objectForKey: kState] intValue]; 
    switch(state) { 
     case PJSIP_INV_STATE_CALLING: { // After INVITE is sent. 
     [self.delegate sipConnection:self on_calling:userInfo]; 
     break; 
     } 
     case PJSIP_INV_STATE_INCOMING: {// After INVITE is received. 
     [self.delegate sipConnection:self on_incoming_call:userInfo]; 
     break; 
     } 
     case PJSIP_INV_STATE_EARLY: {// After response with To tag. 
     break; 
     } 
     case PJSIP_INV_STATE_CONNECTING:{ // After 2xx is sent/received. 
     break; 
     } 
     case PJSIP_INV_STATE_CONFIRMED: { // After ACK is sent/received. 
     [self.delegate sipConnection:self on_respond:userInfo]; 
     break; 
     } 
     case PJSIP_INV_STATE_DISCONNECTED: { 
     [self.delegate sipConnection:self on_ending:userInfo]; 
     break; 
     } 
    } 
} 
+0

它對on_incoming_call的調用說了什麼??? 我的意思是它給出任何錯誤消息或在控制檯中的東西? – Suryakant

+0

從哪裏調用這兩種方法? – manujmv

+0

我剛更新了我的文章並添加了屏幕截圖。它不顯示任何錯誤消息。它什麼都不做。這兩個方法是由sip連接類調用的委託方法。我確信他們被觸發了,因爲我在方法中看到了這些消息。 – JonatWang

回答

3

檢查代碼不會被調用在後臺線程上,任何與UI有關的操作都必須在主線程上運行。

我不確定,但調用推視圖控制器的同一個實例可能是罪魁禍首。嘗試每次推送時設置一個新實例,而不是在ViewDidLoad方法中執行。

+0

非常感謝。當我在主線程上執行pushviewcontroller時,我終於可以工作了。它看起來像on_incoming_call被不同的線程調用 – JonatWang

+0

一個確保在主線程上調用特定方法的簡便方法是包含:NSAssert([NSThread mainThread],@「Not on the main thread!」); – Dermot

相關問題