web-dev-qa-db-fra.com

Changer la couleur du texte des éléments dans UIActionSheet - iOS 8

J'avais utilisé le code suivant pour changer la couleur du texte des éléments que j'ai ajoutés dans UIActionSheet .:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
    for (UIView *subview in actionSheet.subviews) {
        if ([subview isKindOfClass:[UIButton class]]) {
            UIButton *button = (UIButton *)subview;
            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        }
    }
}

Cela fonctionne bien dans iOS7, mais dans iOS8, le code ci-dessus ne modifie pas la couleur du texte des éléments.

Maintenant, ma question est de savoir comment changer la couleur du texte des éléments que j’ajoute dans UIActionSheet en utilisant iOS8 ??

Information additionnelle:
J'ai ajouté un point d'arrêt pour voir si les lignes suivantes du code ci-dessus sont exécutées ou non:

UIButton *button = (UIButton *)subview;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

Ces lignes ne sont pas exécutées. Donc, if([subview isKindOfClass:[UIButton class]]) est toujours false pour tous les éléments de actionSheet.subviews. Donc, ce que je pense, c'est que la vue hiérarchique de UIActionSheet a été modifiée.

34
Salman Zaidi

Il existe un moyen simple de continuer à utiliser UIActionSheet au lieu de UIAlertController afin de prendre en charge les anciennes versions iOS.

UIActionSheet utilise réellement UIAlertController dans iOS 8 et possède une propriété privée _alertController.

SEL selector = NSSelectorFromString(@"_alertController");
if ([actionSheet respondsToSelector:selector])
{
    UIAlertController *alertController = [actionSheet valueForKey:@"_alertController"];
    if ([alertController isKindOfClass:[UIAlertController class]])
    {
        alertController.view.tintColor = [UIColor blueColor];
    }
}
else
{
    // use other methods for iOS 7 or older.
}

Pour Swift Below le code devrait fonctionner

let alertAction = UIAlertAction(title: "XXX", style: .default) { (action) in

     }

    alertAction.setValue(UIColor.red, forKey: "titleTextColor")
36
nonamelive

Pour changer la couleur du titre du bouton, vous devez utiliser UIAlertController et définir la tintColor de la view principale.

Exemple de définition des couleurs du titre du bouton sur le noir:

UIAlertController *actionSheetController = [UIAlertController alertControllerWithTitle:@"How would you like to proceed?" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];

UIAlertAction *finish = [UIAlertAction actionWithTitle:@"Finish" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action)
                               {
                                   [self performSelector:@selector(finish:) withObject:nil];
                               }];

UIAlertAction *playAgain = [UIAlertAction actionWithTitle:@"Play Again" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action)
                            {
                                [self performSelector:@selector(playAgain:) withObject:nil];
                            }];

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action)
                         {
                             [actionSheetController dismissViewControllerAnimated:YES completion:nil];
                         }];

[actionSheetController addAction:finish];
[actionSheetController addAction:playAgain];
[actionSheetController addAction:cancel];

//******** THIS IS THE IMPORTANT PART!!!  ***********
actionSheetController.view.tintColor = [UIColor blackColor];

[self presentViewController:actionSheetController animated:YES completion:nil];
31
DiscDev

Ok, j'ai rencontré le même problème mais je pense avoir trouvé une solution:

La manière appropriée devrait être comme ceci et je suppose que cela fonctionne dans iOS7:

[[UIButton appearanceWhenContainedIn:[UIActionSheet class], nil] setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

Mais cela ne fonctionnera pas dans iOS8 en raison du fait que les "boutons" ActionSheets sont maintenant basés sur un UICollectionView . Ainsi, après quelques recherches approfondies, je souhaite que cela fonctionne:

[[UICollectionView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];
10
Janne

Je l'utilise.

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];

Ajoutez une ligne (AppDelegate) et fonctionne pour tous les UIAlertController.

9
Lucas Torquato

J'ai la même tâche et j'ai fait ce hack aujourd'hui, sale, mais ça marche

class CustomAlertViewController: UIAlertController {

    internal var cancelText: String?


    private var font: UIFont? = UIFont(name: "MuseoSansCyrl-500", size: 12)

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.tintColor = UIColor.blackColor()
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        self.findLabel(self.view) //if you need ios 9 only, this can be made in viewWillAppear
    }

    func findLabel(scanView: UIView!) {
        if (scanView.subviews.count > 0) {
            for subview in scanView.subviews {
                if let label: UILabel = subview as? UILabel {

                    if (self.cancelText != nil && label.text == self.cancelText!) {
                        dispatch_async(dispatch_get_main_queue(),{
                            label.textColor = UIColor.redColor() //for ios 8.x
                            label.tintColor = UIColor.redColor() //for ios 9.x
                        })
                    }

                    if (self.font != nil) {
                        label.font = self.font
                    }
                }

                self.findLabel(subview)
            }
        }
    }

}
6
Igor

Pour utiliser la compatibilité ascendante d’iOS 7 et collecter la couleur de teinte par défaut appropriée (qu’Apple pourrait bien changer dans les futures versions), j’utilise cette méthode. Merci aux réponses sur teinte par défaut et à réponse de Lucas ci-dessus.

    const Class alertControllerClass = NSClassFromString(@"UIAlertController");
    if(alertControllerClass)
    {
        UIColor *defaultTintColour = UIView.new.tintColor;
        [[UIView appearanceWhenContainedIn: alertControllerClass, nil] setTintColor: defaultTintColour];
    }

Attention cependant - vous devez vous assurer que vous utilisez ceci avant que vous commenciez à définir la teinte globale, sinon le UIView.new.tintColor vous donnera simplement la teinte actuelle que vous avez configurée.

3
Benjohn

Changer la tintColor de window a fonctionné pour moi.

Dans le - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method

écrire cela:

[self.window setTintColor:[UIColor redColor]];

Cela a changé la couleur de police de tous les objets UIActionSheet.

3
Abdullah Umer

Swift 4

    let alert =  UIAlertController(title: "title", message: "message", preferredStyle: .alert)
    alert.view.tintColor = UIColor.black
    self.present(alert, animated: true, completion: nil)
0
Lukas Mohs

Pour Swift tu peux faire comme ça

    let alertAction = UIAlertAction(title: "XXX", style: .default) { (action) in

     }

    alertAction.setValue(UIColor.red, forKey: "titleTextColor")
0
Kuntal Gajjar