self.navigationController不为null,但pushViewController不工作

问题描述:

基本上,我有以下两种方法推送相同的调用视图控制器_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

检查代码不会被调用在后台线程上,任何与UI有关的操作都必须在主线程上运行。

我不确定,但调用推视图控制器的同一个实例可能是罪魁祸首。尝试每次推送时设置一个新实例,而不是在ViewDidLoad方法中执行。

+0

非常感谢。当我在主线程上执行pushviewcontroller时,我终于可以工作了。它看起来像on_incoming_call被不同的线程调用 – JonatWang

+0

一个确保在主线程上调用特定方法的简便方法是包含:NSAssert([NSThread mainThread],@“Not on the main thread!”); – Dermot