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]; }
3 Réponses :
Vous devez vérifier si le code est atteint ou si vous avez simplement un problème d'affichage.
NSLOG's clarifiera cela. P>
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: p> 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: p>
Je ne sais pas exactement comment 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 Si vous incluez Si vous souhaitez laisser votre application quitter une fois que l'alerte est terminée, vous pouvez probablement le faire en appelant NSRunLoop's 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. P> [alerterview show] code> 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 code>). p>
Afficher code>) mais l'alerte n'apparaît pas (cela se produirait dans la boucle d'exécution). P>
[[NSRUNLOOOOOOOOPRUNLOOP] exécuté] code> à la fin de votre gestionnaire d'exception, l'alerte peut apparaître. P>
RunnililTate: CODE> 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. P>
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.
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);
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