Di Objective C itu sederhana: itu cukup untuk memperbarui file main.m dan mengubah parameter UIApplicationMain ()
return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));
Tetapi dengan cepat tidak ada file main.m, karena panduan mengatakan
"Kode yang ditulis pada cakupan global digunakan sebagai titik masuk untuk program, jadi Anda tidak memerlukan fungsi utama."
Lantas, bagaimana cara membuat subclass UIApplication dengan cepat ?? Ada saran?
ios
cocoa-touch
swift
LombaX
sumber
sumber
UIApplicationMain()
parameter, untuk menambahkan nama kelasNSPrincipalClass
di bawah di app-info.plist?Jawaban:
Oke, saya sudah menemukan solusinya
Pertama, saya perhatikan bahwa, di bagian atas file AppDelegate.swift, ada baris ini
@UIApplicationMain
Karena baris ini berada di luar cakupan apa pun (ada di level file), baris ini dijalankan segera, dan saya berasumsi bahwa kompilator menerjemahkannya dalam fungsi utama standar.
Jadi, saya melakukan ini, mulai dari aplikasi Swift-Only baru:
@UIApplicationMain
PENTING file HARUS NAMA main.swift, karena pernyataan tingkat atas tidak didukung di file lain! Anda tidak dapat menambahkan panggilan UIApplicationMain () di dalam file lain, jika tidak, Anda akan menerima kesalahan ini:
Ini adalah file main.swift
UIApplicationMain( CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self) )
Kemudian, buat file swift untuk subclass UIApplication, FLApplication.swift, dengan kode ini:
import UIKit import Foundation class FLApplication: UIApplication { override func sendEvent(_ event: UIEvent) { super.sendEvent(event) print("send event") } }
sekarang, UIApplication sudah di-subclass dengan benar dan Anda akan melihat pesan "send event" di log
EDIT - MARET 2015
Seperti yang dikomentari oleh Hu Junfeng sekarang, penjelasan tentang
UIApplicationMain
dan file main.swift didokumentasikan di bagian Atribut Referensi Bahasa Swift: TautanSeperti yang dikomentari oleh Thomas Verbeek Dalam XCode 6.3 Beta, Anda mungkin menemukan bahwa C_ARGC dan C_ARGV telah diubah namanya menjadi Process.argc dan Process.unsafeArgv. Panggilan UIApplicationMain Anda di file main.swift perlu diperbarui ke:
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
Sintaks pra-XCode 8 adalah
import Foundation import UIKit UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
EDIT - DES 2016
Solusi untuk Xcode 8, sebelum beta 6
import Foundation import UIKit UIApplicationMain( CommandLine.argc, UnsafeMutableRawPointer(CommandLine.unsafeArgv) .bindMemory( to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)), NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self) )
sumber
sendEvent:
saat ini (saya ingat harus melakukannya di iOS 3 ...)UIApplicationMain
danmain.swift
didokumentasikan di bagian Atribut Referensi Bahasa Swift. developer.apple.com/library/ios/documentation/Swift/Conceptual/…C_ARGC
danC_ARGV
telah diubah namanya menjadiProcess.argc
danProcess.unsafeArgv
masing - masing. Panggilan UIApplicationMain Anda di file main.swift perlu diperbarui keUIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(KBApplication), NSStringFromClass(AppDelegate))
Salah satu alternatifnya adalah dengan memperluas
UIApplication
alih-alih membuat subkelasnya. Menurut iBook yang dirilis oleh Apple, ekstensi di Swift dapat:Jika kebutuhan Anda dalam subclass
UIApplication
dipenuhi oleh kemampuan tersebut, Extension mungkin adalah cara yang tepat.sumber
Buat subclass dari
UIApplication
dan tambahkan logika Andaimport UIKit class CustomUIApplication: UIApplication { override func sendEvent(_ event: UIEvent) { super.sendEvent(event) } }
Buat
main.swift
file yang memanggilUIApplicationMain()
fungsi global [About] , yang merupakan titik masuk baru dari aplikasi Anda yang dipanggil oleh OS. Fungsi ini menerima argumen dari fungsi yang dipanggil,UIApplication
namaUIApplicationDelegate
kelas , nama kelas dan memulai run loop utama.import UIKit UIApplicationMain( CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(CustomUIApplication.self), //was created at step 1 NSStringFromClass(AppDelegate.self) )
Hapus / komentari
@UIApplicationMain
anotasi di defaultAppDelegate
.@UIApplicationMain
menghasilkanmain.swift
.Jika tidak, Anda akan mendapatkan kesalahan kompilasi:
//@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { //... }
sumber