webentwicklung-frage-antwort-db.com.de

Textfarbe von Elementen in UIActionSheet ändern - iOS 8

Ich habe folgenden Code verwendet, um die Textfarbe von Elementen zu ändern, die ich in 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];
        }
    }
}

Es funktioniert gut in iOS7, aber in iOS8 ändert der obige Code die Textfarbe der Elemente nicht.

Jetzt frage ich mich, wie ich die Textfarbe der Elemente ändern kann, die ich in UIActionSheet mit iOS8 ?? .__ füge.

Zusätzliche Information:
Ich habe einen Haltepunkt hinzugefügt, um zu sehen, ob die folgenden Zeilen aus dem obigen Code ausgeführt werden oder nicht:

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

Diese Zeilen werden nicht ausgeführt. Daher ist if([subview isKindOfClass:[UIButton class]]) immer false für alle Elemente von actionSheet.subviews. Ich denke also, dass die Ansichts-Hierarchie von UIActionSheet geändert wurde.

34
Salman Zaidi

Es ist ein einfacher Weg, wenn Sie weiterhin UIActionSheet anstelle von UIAlertController verwenden möchten, um ältere iOS-Versionen zu unterstützen.

UIActionSheet verwendet tatsächlich UIAlertController in iOS 8 und verfügt über eine private Eigenschaft _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.
}

Für Swift Below sollte der Code funktionieren

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

     }

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

Um die Farbe des Schaltflächentitels zu ändern, müssen Sie UIAlertController verwenden und tintColor des Haupt-view einstellen.

Beispiel für das Setzen der Schaltflächenfarben auf Schwarz:

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, ich hatte das gleiche Problem, aber ich glaube, ich habe eine Lösung gefunden:

Der geeignete Weg sollte so sein und ich denke, es funktioniert unter iOS7:

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

In iOS8 wird es jedoch nicht funktionieren, da die "Buttons" der ActionSheets jetzt auf einer UICollectionView ..__ basieren. Nach einigem herumgraben habe ich das stattdessen gefunden:

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

Ich benutze es.

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

Fügen Sie eine Zeile hinzu (AppDelegate) und funktioniert für alle UIAlertController.

9
Lucas Torquato

Ich habe dieselbe Aufgabe und ich habe diesen Hack heute gemacht, schmutzig, aber es funktioniert

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

Für iOS 7-Abwärtskompatibilität und zur Erfassung der richtigen Standardfarbtonfarbe (die Apple in zukünftigen Versionen möglicherweise ändern wird) verwende ich diese Option. Danke an die Antworten zu default tint und an Lucas Lucas Antwort oben.

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

Achtung! Sie müssen jedoch sicherstellen, dass Sie dieses verwenden, bevor Sie mit der Einstellung des globalen Farbtons beginnen. Andernfalls erhalten Sie mit dem UIView.new.tintColor den aktuellen Farbton.

3
Benjohn

Die tintColor von window zu ändern, hat für mich funktioniert.

In der - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method

schreib Dies:

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

Dadurch wurde die Schriftfarbe aller UIActionSheet-Objekte geändert.

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

Für Swift kannst du so etwas tun

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

     }

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