Cambiar el color del texto de los elementos en UIActionSheet – iOS 8

He estado usando el siguiente código para cambiar el color del texto de los elementos que agrego en 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]; } } } 

Funciona bien en iOS7 , pero en iOS8 el código anterior no cambia el color del texto de los elementos.

Ahora mi pregunta es cómo cambiar el color del texto de los elementos que agrego en UIActionSheet usando iOS8 ?

Información adicional:
Agregué punto de interrupción para ver si las siguientes líneas del código anterior se ejecutan o no:

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

Estas líneas no se ejecutan. Entonces, if([subview isKindOfClass:[UIButton class]]) siempre es false para todos los elementos de actionSheet.subviews . Entonces, lo que creo es que la jerarquía de vista de UIActionSheet ha cambiado.

Hay una manera fácil si aún desea usar UIActionSheet lugar de UIAlertController para admitir versiones anteriores de iOS.

UIActionSheet realmente usa UIAlertController en iOS 8, y tiene una propiedad privada _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. } 

Para cambiar el color del título del botón, necesita usar UIAlertController y establecer el tintColor de la view principal.

Ejemplo de configuración de los colores del título del botón a negro:

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

Ok, me encontré con el mismo problema, pero creo que he encontrado una solución:

La forma adecuada debería ser así y supongo que funciona en iOS7:

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

Pero no funcionará en iOS8 debido al hecho de que los “botones” de ActionSheets ahora se basan en un UICollectionView. Entonces, después de investigar un poco, conseguí que esto funcionara:

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

Lo estoy usando.

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

Agregue una línea (AppDelegate) y funcione para todo UIAlertController.

Tengo la misma tarea y he hecho esto hoy, sucio, pero funciona

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

Cambiar el tintColor de la window funcionó para mí.

En la aplicación - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method

escribe esto:

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

Esto cambió el color de la fuente de todos los objetos UIActionSheet .

Para compatibilidad con versiones anteriores de iOS 7, y para recostackr el color de matiz predeterminado adecuado (que Apple bien puede cambiar en versiones futuras), uso esto. Gracias a las respuestas sobre el tinte predeterminado y a la respuesta de Lucas anterior.

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

Sin embargo, tenga UIView.new.tintColor : debe asegurarse de usar esto antes de comenzar a configurar el tinte global; de lo contrario, UIView.new.tintColor le proporcionará el tinte actual que ha configurado.