9
votes

Afficher une alerte dans un gestionnaire d'exception de niveau supérieur iPhone

J'essaie d'afficher un uialertview dans un gestionnaire d'exception iPhone de haut niveau. La fonction de gestionnaire ressemble à ceci:

void applicationExceptionHandler(NSException *ex) {
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                      message:[ex reason]
                                                      delegate:nil
                                             cancelButtonTitle:@"OK"
                                             otherButtonTitles:nil];
  [alertView show];
}


0 commentaires

3 Réponses :


0
votes

Vous devez vérifier si le code est atteint ou si vous avez simplement un problème d'affichage.

NSLOG's clarifiera cela.

Si non atteint, vous devez empêcher l'arrêt de l'application et vous aurez peut-être besoin d'une retardée. Action pour sortir de ce contexte pour l'appel d'alerte: xxx

Si vous atteignez le contexte informatique et l'exécution n'est pas un problème, mais vous ne voyez simplement pas d'alerte, puis [alerte Afficher] ne peut pas être le plus haut niveau d'affichage. Dans ce cas, vous devrez peut-être rediriger un message via ShowInview E.G. avec feuille d'action: xxx


0 commentaires

8
votes

Je ne sais pas exactement comment [alerterview show] est implémenté, mais j'imagine que cela apporte des modifications à la hiérarchie de la vue, puis se définit pour afficher l'alerte sur le prochain passage à travers la course. boucle (rechercher nsrunloop ).

Mais, puisque l'application est sur le point d'arrêter de fumer, le contrôle ne revient pas à la boucle d'exécution, l'alerte n'est donc jamais affichée. C'est pourquoi vous voyez l'écran Dim (le niveau d'alerte uiwindow est immédiatement ajouté par Afficher ) mais l'alerte n'apparaît pas (cela se produirait dans la boucle d'exécution).

Si vous incluez [[NSRUNLOOOOOOOOPRUNLOOP] exécuté] à la fin de votre gestionnaire d'exception, l'alerte peut apparaître.

Si vous souhaitez laisser votre application quitter une fois que l'alerte est terminée, vous pouvez probablement le faire en appelant NSRunLoop's RunnililTate: dans une boucle tandis que, vérifiant la valeur d'un drapeau pour voir si le alerte a déjà été rejetée. S'il en a, quittez simplement la fonction de gestionnaire et vous êtes prêt à partir. Cela signifie que vous devrez définir un objet de délégué sur l'alerte qui définit ce drapeau.

Si vous voulez laisser votre application continuer à courir ... Je ne suis pas si sûr. Vous pouvez simplement laisser la boucle de course continuer à sortir du gestionnaire d'exception, mais il pourrait y avoir des effets secondaires mauvais / étranges à cela. Donc, vous devriez probablement laisser l'application cesser de fumer. En outre, si vous êtes sûr de pouvoir récupérer à partir de l'exception, vous auriez dû l'attraper quelque part.


3 commentaires

Merci, j'ai posté une autre solution à ce fil en fonction de votre réponse.


Avez-vous vraiment besoin d'afficher le message d'erreur à l'utilisateur? Peut-être que ce serait mieux si vous pouviez faire face à l'exception en silence et ne pas vous inquiéter de résoudre ce problème de toute façon.


@Nick Idéalement oui, mais c'est du code pour gérer des exceptions imprévues non capturées, imprévues et inattendues. Espérons que cela n'est jamais invoqué, mais si tel est le cas, la variante est de laisser l'application soudainement arrêter sans aucun avertissement.



9
votes

Merci beaucoup à Benzado, voici ce que je pense, c'est un grand gestionnaire d'exception générique de niveau supérieur. Je suis un débutant, j'espère donc que c'est bien fait, mais cela fonctionne :)

dans mon ... Appdelegate.m: P>

@interface ...appDelegate : NSObject <UIApplicationDelegate, UIAlertViewDelegate>
...
void exceptionHandler(NSException *exception);


2 commentaires

Cela semble bon. Personnellement, je créerais un objet distinct pour servir de délégué de l'alerte. Puisque nous sommes en mode sinistre, il est logique d'être isolé du reste du code de l'application. Mais sinon, ça va bien.


Cela peut être rendu plus joliment si combiné à une implémentation UialertView + Blocks. Comme ceci (pas mon code): Github.com/mugunthkumar/uikitCategoryAdditions