Показ предупреждения в высокоуровневом обработчике исключений iPhone

int pow( int base, int exponent)

{   // Does not work for negative exponents. (But that would be leaving the range of int) 
    if (exponent == 0) return 1;  // base case;
    int temp = pow(base, exponent/2);
    if (exponent % 2 == 0)
        return temp * temp; 
    else
        return (base * temp * temp);
}
9
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

Я не знаю точно, как реализовано [alertView show] , но я предполагаю, что он вносит некоторые изменения в иерархию представлений, а затем настраивается для отображения предупреждения следующий проход через цикл выполнения (найдите NSRunLoop ).

Но, поскольку приложение вот-вот завершится, управление не возвращается в цикл выполнения, поэтому предупреждение никогда не отображается. Вот почему вы видите тусклый экран (UIWindow уровня предупреждения немедленно добавляется с помощью show ), но предупреждение не появляется (это может произойти в цикле выполнения).

Если вы включите ] [[NSRunLoop currentRunLoop] run] в конце обработчика исключений может появиться предупреждение.

Если вы хотите, чтобы ваше приложение завершило работу после того, как предупреждение будет выполнено, вы, вероятно, можете сделать это, вызвав NSRunLoop's runUntilDate: в цикле while, проверяя значение флага, чтобы узнать, было ли предупреждение отклонено. Если это так, просто выйдите из функции обработчика, и все готово. Это означает, что вам нужно будет установить объект делегата для оповещения, который устанавливает этот флаг.

Если вы хотите, чтобы ваше приложение продолжало работать ... в этом я не уверен. Вы можете просто позволить циклу выполнения продолжать выходить из обработчика исключений, но это может иметь плохие / странные побочные эффекты. Так что вы, вероятно, должны позволить приложению выйти. Кроме того, если вы уверены, что сможете восстановиться после исключения, вы должны были где-то его поймать.

Мне нужно будет установить объект делегата для оповещения, который устанавливает этот флаг.

Если вы хотите, чтобы ваше приложение продолжало работать ... я не уверен. Вы можете просто позволить циклу выполнения продолжать выходить из обработчика исключений, но это может иметь плохие / странные побочные эффекты. Так что вы, вероятно, должны позволить приложению выйти. Кроме того, если вы уверены, что сможете восстановиться после исключения, вы должны были где-то его поймать.

Мне нужно будет установить объект делегата для оповещения, который устанавливает этот флаг.

Если вы хотите, чтобы ваше приложение продолжало работать ... я не уверен. Вы можете просто позволить циклу выполнения продолжать выходить из обработчика исключений, но это может иметь плохие / странные побочные эффекты. Так что вам, вероятно, следует позволить приложению выйти. Кроме того, если вы уверены, что сможете восстановиться после исключения, вы должны были где-то его поймать.

8
ответ дан 4 December 2019 в 12:19
поделиться

Вы должны проверить, достигнут ли код или просто возникла проблема с отображением.

NSLog прояснит это.

Если не достигнут, вам нужно предотвратить завершение работы приложения, и вы можете требуется отложенное действие, чтобы выйти из этого контекста для вызова предупреждения:

[self performSelector: @selector(showAlert:) withObject:@"msg" afterDelay: 0.1];

Если вы достигли его и контекст выполнения не является проблемой, но вы просто не видите предупреждения, то [отображение предупреждений] может быть не на верхнем уровне в дисплей. В таком случае вам может потребоваться перенаправить сообщение через showinview, например, с помощью таблицы действий:

topDelegate=[[UIApplication sharedApplication] delegate];
topDelegateWindow=[topDelegate.window.subviews objectAtIndex:0];

[actionSheet showInView:topDelegateWindow];
0
ответ дан 4 December 2019 в 12:19
поделиться