Estoy tratando de convertir mi aplicación al lenguaje Swift.
Tengo esta línea de código:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
¿Cómo convertirlo a Swift?
En los documentos de Apple , no existe tal método.
ios
swift
uiappearance
AlexZd
fuente
fuente
Respuestas:
Actualización para iOS 9:
Si está apuntando a iOS 9+ (a partir de Xcode 7 b1), hay un nuevo método en el
UIAppearance
protocolo que no usa varargs:Que se puede usar así:
Si aún necesita admitir iOS 8 o anterior, use la siguiente respuesta original a esta pregunta.
Para iOS 8 y 7:
Estos métodos no están disponibles para Swift porque los métodos de varargs Obj-C no son compatibles con Swift (consulte http://www.openradar.me/17302764 ).
Escribí una solución no variada que funciona en Swift (repetí el mismo método para
UIBarItem
, que no desciendeUIView
):-
Solo asegúrese de hacerlo
#import "UIAppearance+Swift.h"
en su encabezado de puente.Luego, para llamar desde Swift (por ejemplo):
fuente
ios 10 swift 3
fuente
Para iOS 8 y 7:
Utilizo una categoría basada en la respuesta de Alex para especificar varios contenedores. Esta es una solución alternativa hasta que Apple sea oficialmente compatible
appearanceWhenContainedIn
con Swift.UIAppearance + Swift.h
UIAppearance + Swift.m
Luego agregue
#import "UIAppearance+Swift.h"
a su encabezado de puente.Para usar desde Swift :
Fue bueno poder encontrar una forma de usar CVarArgType , pero no encontré una solución limpia.
fuente
Aquí hay una solución menos fea, pero aún fea, inspirada en @tdun.
AppearanceBridger
.AppearanceBridger
named+(void)setAppearance
y coloque el código de apariencia Objective-C en este método. Por ejemplo:AppearanceBridger.setAppearance()
y ¡debería estar listo!Espero que esto funcione bien para las personas que lo ven.
fuente
Aquí hay una solución fea que usé ...
Simplemente haga una clase Objective-C Cocoa Touch Class (UIViewController), llamada lo que quiera.
Yo llamé el mío
WorkaroundViewController
...Ahora en (
WorkaroundViewController.m
):Ejecute el código de apariencia de Objective-C para
.appearanceWhenContainedIn()
(aquí está mi ejemplo):Luego cree un encabezado de puente para su proyecto Swift y luego inicialice su Objective-C ViewController en su código Swift, así (de nuevo, solo mi ejemplo):
Entonces has terminado! Avísame si te funciona ... Como dije, es feo, ¡pero funciona!
fuente
Esto se puede extender a cualquier clase que se ajuste al protocolo de apariencia UIA, no solo a UIViews. Así que aquí hay una versión más genérica:
UIAppearance + Swift.h
UIAppearance + Swift.m
fuente
He creado un repositorio para ustedes que quieran usar
CocoaPods
:Agregue esto a su
Podfile
:Importa en tu clase:
Referencia: https://github.com/levantAJ/UIViewAppearanceSwift
fuente
Swift 4: iOS 9+
fuente
Parece que Swift (al menos a partir de Beta5) no puede soportarlo por razones desconocidas para mí. Quizás la función de idioma requerida todavía está en progreso, ya que solo puedo suponer que la dejaron fuera de la interfaz por una buena razón. Como dijiste, según los documentos todavía está disponible en ObjC. Realmente decepcionante.
fuente
appearanceWhenContainedIn:
todavía está fuera de la mesa.Puedes usar esto:
Editar: aparienciaWhenContainedIn se eliminó en Swift. Esta respuesta fue para la Beta 5 para cambiar la apariencia del texto de todos los botones de barra.
fuente
UIControlState.Normal
, solo puede usar.Normal
Swift conoce el tipo por inferencia.appearanceWhenContainedIn
se ha eliminado.Debería poder traducir la
Objective-C
sintaxis aSwift
sintaxis.En rápido los métodos deben declararse así:
Entonces puedes probar esto:
Todavía tengo que averiguar si esta es la forma limpia de llamar a un método de clase
Swift
.Espero que esto ayude,
fuente
UIAppearance
documentación del protocolo (a la que seUIBarButtonItem
ajusta), existe el método `aparienciaWhenContainedIn (_ :) (todavía no está implementado en Swift): developer.apple .com / library / prerelease / ios / documentation / UIKit / ...