Изменение текста Цвет элементов в UIActionSheet - iOS 8

Я использовал следующий код для изменения цвета текста элементов, которые я добавляю в 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];
        }
    }
}

Он отлично работает в iOS7, но в iOS8 приведенный выше код не меняет цвет текста элементов.

Теперь у меня вопрос, как изменить цвет текста элементов, которые я добавляю в UIActionSheet, используя iOS8?

Дополнительная информация:
Я добавил точку останова, чтобы увидеть, выполняются ли следующие строки из приведенного выше кода или нет:

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

Эти строки не выполняются. Итак, if([subview isKindOfClass:[UIButton class]]) всегда false для всех элементов actionSheet.subviews. Итак, я думаю, что представление о герархии UIActionSheet было изменено.

Ответ 1

Простой способ, если вы хотите использовать UIActionSheet вместо UIAlertController, чтобы поддерживать более старые версии iOS.

UIActionSheet фактически использует UIAlertController в iOS 8 и имеет частное свойство _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.
}

Ответ 2

Чтобы изменить цвет названия кнопки, вы должны использовать UIAlertController и установить tintColor основного view.

Пример настройки цвета названия кнопок на черный:

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];

Ответ 3

Хорошо, я столкнулся с той же проблемой, но думаю, что нашел решение:

Соответствующий способ должен быть таким, и я предполагаю, что он работает в iOS7:

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

Но это не будет работать в iOS8 из-за того, что кнопки "Action" ActionSheets теперь основаны на UICollectionView. Поэтому после некоторого копания я получил это вместо этого:

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

Ответ 4

Я использую его.

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

Добавьте одну строку (AppDelegate) и работайте для всего UIAlertController.

Ответ 5

У меня такая же задача, и сегодня я сделал этот взлом, грязный, но он работает

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

Для меня работала tintColor window.

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

напишите это:

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

Это изменило цвет шрифта для всех объектов UIActionSheet.

Ответ 7

Для обратной совместимости с iOS 7 и для сбора правильного цвета оттенков по умолчанию (который Apple может изменить в будущих версиях), я использую это. Спасибо за ответы default tint и Лукас ответьте выше.

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

Осторожно, но вам нужно убедиться, что вы используете это, прежде чем начинать настройку глобального оттенка, иначе UIView.new.tintColor просто даст вам текущий оттенок, который вы настроили.

Ответ 8

Swift 4

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