Próbuję przekonwertować moją aplikację na język Swift.
Mam ten wiersz kodu:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
Jak przekonwertować go na Swift?
W dokumentach Apple nie ma takiej metody.
ios
swift
uiappearance
AlexZd
źródło
źródło
Odpowiedzi:
Aktualizacja dla iOS 9:
Jeśli celujesz w system iOS 9+ (od Xcode 7 b1), w
UIAppearance
protokole jest nowa metoda , która nie korzysta z funkcji varargs:Które można wykorzystać w ten sposób:
Jeśli nadal potrzebujesz obsługi systemu iOS 8 lub starszego, użyj następującej oryginalnej odpowiedzi na to pytanie.
W przypadku iOS 8 i 7:
Te metody nie są dostępne dla Swift, ponieważ metody Obj-C varargs nie są kompatybilne z Swift (patrz http://www.openradar.me/17302764 ).
Napisałem niezróżnicowane obejście, które działa w Swift (powtórzyłem tę samą metodę dla
UIBarItem
, która nie pochodzi odUIView
):-
Po prostu upewnij się, że
#import "UIAppearance+Swift.h"
w nagłówku mostkowania.Następnie, aby zadzwonić z Swift (na przykład):
źródło
ios 10 swift 3
źródło
W przypadku iOS 8 i 7:
Używam kategorii opartej na odpowiedzi Alexa, aby określić wiele kontenerów. Jest to obejście, dopóki Apple oficjalnie nie będzie wspierać
appearanceWhenContainedIn
w Swift.UIAppearance + Swift.h
UIAppearance + Swift. M
Następnie dodaj
#import "UIAppearance+Swift.h"
do swojego nagłówka mostkowania.Aby użyć z Swift :
Dobrze, gdybym mógł znaleźć sposób za pomocą CVarArgType , ale nie znalazłem czystego rozwiązania.
źródło
Oto mniej brzydkie, ale wciąż brzydkie obejście inspirowane @tdun.
AppearanceBridger
.AppearanceBridger
named+(void)setAppearance
i umieść kod wyglądu Objective-C w tej metodzie. Na przykład:AppearanceBridger.setAppearance()
i powinieneś być gotowy!Mam nadzieję, że to działa dobrze dla osób, które to widzą.
źródło
Oto brzydkie rozwiązanie obejścia, którego użyłem ....
Po prostu utwórz klasę dotykową kakao Objective-C (UIViewController), o dowolnej nazwie.
Nazwałem moje
WorkaroundViewController
...Teraz w (
WorkaroundViewController.m
):Uruchom kod wyglądu Objective-C dla
.appearanceWhenContainedIn()
(oto mój przykład):Następnie utwórz nagłówek mostkujący dla swojego projektu Swift, a następnie zainicjuj kontroler widoku Objective-C w swoim kodzie Swift, w ten sposób (ponownie, tylko mój przykład):
Gotowe! Daj mi znać, czy to działa dla Ciebie ... Tak jak powiedziałem, jest brzydkie, ale działa!
źródło
Można to rozszerzyć na dowolną klasę zgodną z protokołem UIAppearance - nie tylko na UIViews. Oto bardziej ogólna wersja:
UIAppearance + Swift.h
UIAppearance + Swift. M
źródło
Stworzyłem repozytorium dla was, którzy chcą używać
CocoaPods
:Dodaj to do
Podfile
:Importuj w swojej klasie:
Źródła: https://github.com/levantAJ/UIViewAppearanceSwift
źródło
Swift 4: iOS 9+
źródło
Wygląda na to, że Swift (przynajmniej od wersji Beta5) nie jest w stanie go obsługiwać z nieznanych mi powodów. Być może wymagana funkcja języka jest nadal w toku, ponieważ mogę tylko założyć, że nie ma jej w interfejsie z dobrego powodu. Jak powiedziałeś, zgodnie z dokumentacją jest nadal dostępny w ObjC. Naprawdę rozczarowujące.
źródło
appearanceWhenContainedIn:
nadal jest poza stołem.Możesz użyć tego:
Edycja: wygląd WhenContainedIn został usunięty w języku Swift. Ta odpowiedź dotyczyła zmiany wyglądu tekstu wszystkich przycisków paska w wersji Beta 5.
źródło
UIControlState.Normal
, możesz po prostu użyć.Normal
Swift zna typ przez wnioskowanie.appearanceWhenContainedIn
został usunięty.Powinieneś być w stanie po prostu przetłumaczyć
Objective-C
składnię naSwift
składnię.W szybkim tempie metody powinny być zadeklarowane w następujący sposób:
Możesz więc spróbować tego:
Nadal muszę się dowiedzieć, czy jest to czysty sposób wywołania metody klasy
Swift
.Mam nadzieję że to pomoże,
źródło
UIAppearance
dokumentację protokołu (któraUIBarButtonItem
jest zgodna), metoda `lookWhenContainedIn (_ :) istnieje (po prostu nie jest jeszcze zaimplementowana w Swift): developer.apple .com / library / prerelease / ios / dokumentacja / UIKit /…