web-dev-qa-db-fra.com

Personnalisez UIAlertController dans iOS 8 pour inclure des éléments standard comme UITableView

Je suis habitué à personnaliser UIAlertViews via le [alert setValue:someView forKey:@"accessoryView"] méthode. Cela crée un contenu personnalisable pour UIAlertViews avec des hauteurs personnalisées. Cependant, cela ne fonctionne que sur iOS7 et versions ultérieures. Dans iOS8, le UIAlertController a pris le relais, et je ne peux plus le personnaliser, cela réduira la hauteur du UIAlertView.

Est-ce impossible à cause d'une mauvaise utilisation du UIAlertController, ou comment suis-je censé le faire? J'essaie d'incorporer un UITableView dans un UIAlertController avec UIAlertControllerStyleAlert.

THX.

17
kbjeppesen

Je suis tombé sur le même problème en ce moment. J'ai regardé l'en-tête privé pour UIAlertController ( https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIAlertController.h ) et j'ai trouvé un produit prometteur propriété: contentViewController

Et il s'est avéré être exactement le même que accessoryView pour UIAlertView, la différence étant que vous devez attribuer un UIViewController à cette propriété plutôt qu'un UIView.

UIViewController *v = [[UIViewController alloc] init];
v.view.backgroundColor = [UIColor redColor];

[alertController setValue:v forKey:@"contentViewController"];

Ce morceau de code affichera une vue rouge sur la vue d'alerte! Bonne personnalisation d'UIAlertController;)

PS. C'est une propriété privée mais en utilisant KVC il ne devrait pas y avoir de problème sur l'App Store, je pense.

Modifier:

Certaines personnes se sont plaintes que ce n'était pas très sûr. Ce n'est pas une API publique, donc oui, Apple pourrait le changer dans n'importe quelle version, entraînant l'échec de cette méthode.

Pour vous assurer que votre application entière ne se bloque pas si cela se produit, vous pouvez encapsuler l'appel KVC dans un bloc try. Si la propriété change, votre contrôleur n'affichera pas la vue du contenu, mais il ne se bloquera pas non plus:

@try {
    [alertController setValue:v forKey:@"contentViewController"];
}
@catch(NSException *exception) {
    NSLog(@"Failed setting content view controller: %@", exception);
}

L'utilisation de cette méthode en production peut être risquée et je ne la recommande pas pour les alertes importantes.

35
JonasG

Je vous suggère de ne pas perdre votre temps à essayer de créer une interface utilisateur supplémentaire dans un endroit où il n'est pas censé être. Basé sur les dernières années d'améliorations, Apple ajoutera probablement une vue personnalisée dans le prochain iOS. D'ici là, jetez un œil à un cadre conçu pour gérer cette situation exacte sans renverser les meilleures pratiques : SDCAlertView

Il prend en charge les alertes qui imitent les alertes natives sur iOS 7,8,9, y compris la gestion de tous les cas Edge désagréables concernant le dimensionnement, les types de boutons, la rotation, etc. Il prend en charge des vues personnalisées arbitraires dans l'alerte.

SDCAlertView demo gif

J'utilise cette bibliothèque dans Yahoo YMPromptKit pour des invites de notification push personnalisées qui ressemblent exactement à iOS native. Voici un autre exemple:

enter image description here

11
Adam Kaplan

Je pense que vous pouvez facilement personnaliser l'UIView en ajoutant les contrôles nécessaires et le présenter de manière modale, à moins que vous n'ayez une autre raison spécifique d'utiliser uniquement UIAlertController.

https://www.cocoacontrols.com/search?q=UIAlertview

2
CyberInfo

Vous pouvez le faire avec juste une ligne de code en utilisant ma catégorie UIAlertController et remplacer les alertes existantes dans l'application, vérifiez-le ici .

enter image description here

1
mientus