更改UIActionSheet中项目的文本颜色 - iOS 8

时间:2014-06-11 04:52:14

标签: ios uiactionsheet ios8 uiactionsheetdelegate

我一直在使用以下代码来更改我在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已被更改。

9 个答案:

答案 0 :(得分:36)

如果您仍想使用UIActionSheet代替UIAlertController以支持较旧的iOS版本,则可以轻松实现。

UIActionSheet实际上在iOS 8中使用UIAlertController,并且它有一个私有属性_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.
}

对于Swift,下面的代码应该可行

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

     }

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

答案 1 :(得分:31)

要更改按钮标题颜色,您需要使用UIAlertController并设置主tintColor的{​​{1}}。

将按钮标题颜色设置为黑色的示例:

view

答案 2 :(得分:10)

好的,我遇到了同样的问题,但我想我找到了一个解决方案:

适当的方式应该是这样的,我猜它适用于iOS7:

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

但是由于ActionSheets"按钮"它在iOS8中不起作用。现在基于UICollectionView。 因此,经过一些挖掘,我得到了这个工作:

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

答案 3 :(得分:9)

我正在使用它。

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

添加一行(AppDelegate)并适用于所有UIAlertController。

答案 4 :(得分:6)

我有同样的任务,我今天做了这个黑客,很脏,但它有效

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)
            }
        }
    }

}

答案 5 :(得分:3)

更改tintColor window为我工作。

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

写下这个:

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

这改变了所有UIActionSheet个对象的字体颜色。

答案 6 :(得分:3)

对于iOS 7向后兼容性,并收集正确的默认色调颜色(Apple可能会在将来的版本中更改),我使用它。感谢上面关于default tintLucas's answer的答案。

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

小心但是 - 您需要确保在开始设置全局色调之前使用此,否则UIView.new.tintColor将只提供您已设置的当前色调。

答案 7 :(得分:0)

快捷键4

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

答案 8 :(得分:0)

对于Swift,您可以这样做

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

     }

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