По сути, у меня есть два следующих метода, которые подталкивают один и тот же контроллер представления вызовов _vcCall. pushViewController отлично работает с методом on_calling, но не работает с on_incoming_call. Я уверен, что self.navigationController не равен нулю, и _vcCall тоже не равен нулю. Я распечатал и navigationController, и _vcCall в обоих методах, и все они имеют один и тот же адрес. Я даже попытался создать новый контроллер представления в on_incoming_call, но он все еще не работает.

У меня есть только одна кнопка на экране, и она нажимает на контроллер представления вызовов при нажатии. когда запускается метод 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;
      }
   }
}
1
JonatWang 15 Окт 2013 в 14:03
Что он говорит при вызове on_incoming_call ??? Я имею в виду, выдает ли это сообщение об ошибке или что-то в консоли?
 – 
Suryakant Sharma
15 Окт 2013 в 14:08
Откуда вы вызываете эти два метода?
 – 
manujmv
15 Окт 2013 в 14:09
Я только что обновил свой пост и добавил скриншот. Он не показывает никаких сообщений об ошибках. он просто ничего не делает. эти два метода являются методами делегата, вызываемыми классом sip-соединения. и я на 200% уверен, что они срабатывают, поскольку я вижу эти сообщения в методах.
 – 
JonatWang
16 Окт 2013 в 05:44
Что вызывает эти методы? У вас есть еще код, который мы можем использовать, это должно быть что-то еще, я не вижу проблем с этим кодом.
 – 
James Campbell
16 Окт 2013 в 06:12
Я не могу придумать ни одной важной части. эти методы вызова являются методами делегата от SIPConnection. Для меня не имеет смысла, что pushviewcontroller работает в одном методе, но не работает в другом.
 – 
JonatWang
16 Окт 2013 в 06:53

1 ответ

Лучший ответ

Убедитесь, что код не вызывается в фоновом потоке, поскольку все, что связано с пользовательским интерфейсом, должно выполняться в основном потоке.

Я не уверен, но вызов push для того же экземпляра контроллера представления может быть виновником. Попробуйте настраивать новый экземпляр каждый раз, когда вы нажимаете, а не :) делать это в методе ViewDidLoad.

3
James Campbell 16 Окт 2013 в 06:14
Большое спасибо. Наконец-то он заработал, когда выполняю pushviewcontroller в основном потоке. похоже, что on_incoming_call вызывается другим потоком
 – 
JonatWang
16 Окт 2013 в 07:15
Удобный способ гарантировать, что конкретный метод вызывается в основном потоке, - это включить: NSAssert ([NSThread mainThread], @ "Не в основном потоке!");
 – 
Dermot
21 Окт 2013 в 12:47