Saya mencoba mengonversi aplikasi saya ke bahasa Swift.
Saya memiliki baris kode ini:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
Bagaimana cara mengubahnya ke Swift?
Dalam dokumen Apple , tidak ada metode seperti itu.
ios
swift
uiappearance
AlexZd
sumber
sumber
Jawaban:
Pembaruan untuk iOS 9:
Jika Anda menargetkan iOS 9+ (pada Xcode 7 b1), ada metode baru dalam
UIAppearance
protokol yang tidak menggunakan varargs:Yang bisa digunakan seperti ini:
Jika Anda masih perlu mendukung iOS 8 atau yang lebih lama, gunakan jawaban asli berikut untuk pertanyaan ini.
Untuk iOS 8 & 7:
Metode ini tidak tersedia untuk Swift karena metode Obj-C varargs tidak kompatibel dengan Swift (lihat http://www.openradar.me/17302764 ).
Saya menulis solusi non-variadik yang bekerja di Swift (saya mengulangi metode yang sama untuk
UIBarItem
, yang tidak turun dariUIView
):-
Pastikan untuk berada
#import "UIAppearance+Swift.h"
di header bridging Anda.Kemudian, untuk menelepon dari Swift (misalnya):
sumber
ios 10 swift 3
sumber
Untuk iOS 8 & 7:
Saya menggunakan kategori berdasarkan jawaban Alex untuk menentukan beberapa wadah. Ini adalah solusi sampai Apple secara resmi mendukung
appearanceWhenContainedIn
di Swift.Penampilan UIA + Swift.h
Penampilan UIA + Swift.m
Lalu tambahkan
#import "UIAppearance+Swift.h"
ke header bridging Anda.Untuk digunakan dari Swift :
Itu baik jika saya dapat menemukan cara menggunakan CVarArgType , tetapi saya tidak menemukan solusi bersih.
sumber
Ini solusi yang kurang jelek, tapi masih jelek, terinspirasi oleh @tdun.
AppearanceBridger
.AppearanceBridger
nama+(void)setAppearance
dan masukkan kode penampilan Objective-C dalam metode ini. Sebagai contoh:AppearanceBridger.setAppearance()
dan Anda harus siap berangkat!Semoga ini bekerja dengan baik untuk orang yang melihatnya.
sumber
Inilah solusi buruk yang saya gunakan ....
Buat saja Object Touch-Cocoa Touch Class (UIViewController), beri nama apa pun yang Anda inginkan.
Saya menamai milik saya
WorkaroundViewController
...Sekarang di (
WorkaroundViewController.m
):Jalankan kode penampilan Objective-C untuk
.appearanceWhenContainedIn()
(inilah contoh saya):Kemudian buat header penghubung untuk proyek Swift Anda dan kemudian inisialisasi ViewController Objective-C Anda dalam kode Swift Anda, seperti ini (sekali lagi, hanya contoh saya):
Lalu kamu selesai! Biarkan saya tahu jika itu bekerja untuk Anda ... Seperti saya katakan, itu jelek, tapi berhasil!
sumber
Ini dapat diperluas ke kelas apa saja yang sesuai dengan protokol UIApearance - bukan hanya UIViews. Jadi inilah versi yang lebih umum:
Penampilan UIA + Swift.h
Penampilan UIA + Swift.m
sumber
Saya telah membuat repo untuk Anda yang ingin menggunakan
CocoaPods
:Tambahkan ini ke Anda
Podfile
:Impor di kelas Anda:
Referensi: https://github.com/levantAJ/UIViewAppearanceSwift
sumber
Swift 4: iOS 9+
sumber
Tampaknya Swift (setidaknya pada Beta5) tidak dapat mendukungnya karena alasan yang tidak saya ketahui. Mungkin fitur bahasa yang diperlukan masih dalam proses, karena saya hanya bisa berasumsi mereka meninggalkannya karena alasan yang baik. Seperti yang Anda katakan, menurut dokumen itu masih tersedia di ObjC. Sangat mengecewakan.
sumber
appearanceWhenContainedIn:
masih dari meja.Anda bisa menggunakan ini:
Sunting: penampilanWhenContainedIn dihapus di Swift. Jawaban ini adalah untuk Beta 5 untuk mengubah tampilan teks dari semua tombol bar.
sumber
UIControlState.Normal
Anda hanya dapat menggunakan.Normal
Swift tahu jenisnya dengan inferensi.appearanceWhenContainedIn
telah dihapus.Anda seharusnya bisa menerjemahkan
Objective-C
sintaks ke dalamSwift
sintaksis.Dalam cepat metode harus dinyatakan seperti ini:
Jadi Anda dapat mencoba ini:
Saya masih harus mencari tahu apakah ini adalah cara yang bersih untuk memanggil metode kelas
Swift
.Semoga ini membantu,
sumber
UIAppearance
dokumentasi protokol (yangUIBarButtonItem
sesuai), metode `appearanceWhenContainedIn (_ :) ada (itu belum diterapkan di Swift): developer.apple .com / perpustakaan /