Estou tentando converter meu aplicativo para o idioma Swift.
Eu tenho esta linha de código:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
Como convertê-lo em Swift?
No documentos da Apple , não existe esse método.
ios
swift
uiappearance
AlexZd
fonte
fonte
Respostas:
Atualização para iOS 9:
Se você está segmentando o iOS 9 ou superior (a partir do Xcode 7 b1), há um novo método no
UIAppearance
protocolo que não usa varargs:Que pode ser usado assim:
Se você ainda precisar oferecer suporte ao iOS 8 ou anterior, use a seguinte resposta original para esta pergunta.
Para iOS 8 e 7:
Esses métodos não estão disponíveis para o Swift porque os métodos de varargs do Obj-C não são compatíveis com o Swift (consulte http://www.openradar.me/17302764 ).
Eu escrevi uma solução alternativa não-variável que funciona em Swift (repeti o mesmo método para
UIBarItem
, que não desceUIView
):-
Apenas certifique-se de
#import "UIAppearance+Swift.h"
no cabeçalho da ponte.Em seguida, para ligar de Swift (por exemplo):
fonte
ios 10 swift 3
fonte
Para iOS 8 e 7:
Eu uso uma categoria com base na resposta de Alex para especificar vários contêineres. Esta é uma solução alternativa até que a Apple suporte oficialmente
appearanceWhenContainedIn
no Swift.UIAppearance + Swift.h
UIAppearance + Swift.m
Em seguida, adicione
#import "UIAppearance+Swift.h"
ao seu cabeçalho de ponte.Para usar do Swift :
Foi bom encontrar uma maneira de usar o CVarArgType , mas não encontrei uma solução limpa.
fonte
Aqui está uma solução menos feia, mas ainda feia, inspirada em @tdun.
AppearanceBridger
.AppearanceBridger
nomeado+(void)setAppearance
e coloque o código de aparência Objective-C nesse método. Por exemplo:AppearanceBridger.setAppearance()
e você deve estar pronto !Espero que isso funcione bem para as pessoas que a veem.
fonte
Aqui está uma solução alternativa feia que eu usei ...
Basta criar uma classe de toque cacau Objective-C (UIViewController), com o nome que você desejar.
Eu nomeei o meu
WorkaroundViewController
...Agora em (
WorkaroundViewController.m
):Execute o código de aparência do Objective-C para
.appearanceWhenContainedIn()
(aqui está o meu exemplo):Em seguida, crie um cabeçalho de ponte para o seu projeto Swift e, em seguida, inicialize seu Objective-C ViewController no seu código Swift, desta forma (novamente, apenas meu exemplo):
Então você está pronto! Deixe-me saber se funciona para você ... Como eu disse, é feio, mas funciona!
fonte
Isso pode ser estendido a qualquer classe que esteja em conformidade com o protocolo UIAppearance - não apenas UIViews. Então, aqui está uma versão mais genérica:
UIAppearance + Swift.h
UIAppearance + Swift.m
fonte
Eu criei um repositório para vocês que querem usar
CocoaPods
:Adicione isso ao seu
Podfile
:Importe na sua classe:
Referência: https://github.com/levantAJ/UIViewAppearanceSwift
fonte
Swift 4: iOS 9 ou superior
fonte
Parece que o Swift (pelo menos a partir do Beta5) não é capaz de suportá-lo por razões desconhecidas para mim. Talvez o recurso de idioma necessário ainda esteja em andamento, pois posso apenas assumir que eles o deixaram de fora da interface por um bom motivo. Como você disse, de acordo com os documentos, ele ainda está disponível no ObjC. Realmente decepcionante.
fonte
appearanceWhenContainedIn:
ainda está fora da mesa.Você pode usar isto:
Edit: a aparênciaWhenContainedIn foi removida no Swift. Essa resposta foi para o Beta 5 alterar a aparência do texto de todos os botões da barra.
fonte
UIControlState.Normal
você pode simplesmente usar.Normal
Swift conhece o tipo por inferência.appearanceWhenContainedIn
foi removido.Você deve conseguir apenas traduzir a
Objective-C
sintaxe paraSwift
sintaxe.No swift, os métodos devem ser declarados assim:
Então você pode tentar isso:
Eu ainda tenho que descobrir se esta é a maneira limpa de chamar um método de classe
Swift
.Espero que isto ajude,
fonte
UIAppearance
documentação do protocolo (UIBarButtonItem
conforme a qual está em conformidade), o método `appearWhenContainedIn (_ :) existe (ainda não foi implementado no Swift): developer.apple .com / library / pré-lançamento / ios / documentation / UIKit /…