W celu C było to proste: wystarczyło zaktualizować plik main.m i zmienić parametry UIApplicationMain ()
return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));
Ale szybko nie ma pliku main.m, jak mówi przewodnik
„Kod napisany w zakresie globalnym jest używany jako punkt wejścia do programu, więc nie potrzebujesz funkcji głównej”.
Jak więc podklasować UIApplication w szybki? Jakieś sugestie?
ios
cocoa-touch
swift
LombaX
źródło
źródło
UIApplicationMain()
parametrów, niż dodanie nazwy klasyNSPrincipalClass
w app-info.plist?Odpowiedzi:
Ok, znalazłem rozwiązanie
Po pierwsze, zauważyłem, że na górze pliku AppDelegate.swift znajduje się ta linia
@UIApplicationMain
Ponieważ ta linia jest poza jakimkolwiek zakresem (na poziomie pliku), jest wykonywana natychmiast i zakładam, że kompilator tłumaczy ją na standardową funkcję główną.
Tak więc zrobiłem to, zaczynając od nowej aplikacji Swift-Only:
@UIApplicationMain
WAŻNE plik MUSI BYĆ NAZWANY main.swift, ponieważ instrukcje najwyższego poziomu nie są obsługiwane w innych plikach! Nie możesz dodać wywołania UIApplicationMain () w żadnym innym pliku, w przeciwnym razie otrzymasz ten błąd:
To jest plik main.swift
UIApplicationMain( CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self) )
Następnie utwórz plik Swift dla podklasy UIApplication, FLApplication.swift, z następującym kodem:
import UIKit import Foundation class FLApplication: UIApplication { override func sendEvent(_ event: UIEvent) { super.sendEvent(event) print("send event") } }
teraz UIApplication jest poprawnie podzielona na podklasy, a w dzienniku zobaczysz komunikaty o wysyłaniu zdarzeń
EDYCJA - MARZEC 2015
Jak skomentował Hu Junfeng, teraz wyjaśnienia dotyczące
UIApplicationMain
pliku main.swift są udokumentowane w sekcji Attributes w The Swift Language Reference: LinkJak skomentował Thomas Verbeek W wersji beta XCode 6.3 może się okazać, że nazwy C_ARGC i C_ARGV zostały zmienione odpowiednio na Process.argc i Process.unsafeArgv. Twoje wywołanie UIApplicationMain w pliku main.swift będzie wymagało aktualizacji do:
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
Składnia pre-XCode 8 brzmiała
import Foundation import UIKit UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
EDYCJA - grudzień 2016 r
Rozwiązanie dla Xcode 8, przed wersją 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) )
źródło
sendEvent:
dzisiejszych czasach (pamiętam, że musiałem to zrobić w iOS 3 ...)UIApplicationMain
imain.swift
są udokumentowane w sekcji Atrybuty w The Swift Language Reference. developer.apple.com/library/ios/documentation/Swift/Conceptual/…C_ARGC
iC_ARGV
został przemianowany naProcess.argc
iProcess.unsafeArgv
odpowiednio. Twoje wywołanie UIApplicationMain w pliku main.swift będzie wymagało aktualizacji doUIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(KBApplication), NSStringFromClass(AppDelegate))
Jedną z alternatyw jest rozszerzenie
UIApplication
zamiast podklasy. Według iBooka wydanego przez Apple, rozszerzenia w Swift mogą:Jeśli Twoje potrzeby w zakresie tworzenia podklas
UIApplication
są zaspokajane przez te możliwości, najlepszym rozwiązaniem może być rozszerzenie.źródło
Utwórz podklasę
UIApplication
i dodaj swoją logikęimport UIKit class CustomUIApplication: UIApplication { override func sendEvent(_ event: UIEvent) { super.sendEvent(event) } }
Utwórz
main.swift
plik, który wywołuje funkcjęUIApplicationMain()
globalną [About] , która jest nowym punktem wejścia aplikacji wywoływanej przez system operacyjny. Ta funkcja otrzymuje argument z wywołanej funkcji,UIApplication
nazwęUIApplicationDelegate
klasy, nazwę klasy i uruchamia główną pętlę uruchamiania.import UIKit UIApplicationMain( CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(CustomUIApplication.self), //was created at step 1 NSStringFromClass(AppDelegate.self) )
Usuń / skomentuj
@UIApplicationMain
domyślnie adnotacjęAppDelegate
.@UIApplicationMain
generujemain.swift
.Jeśli tego nie zrobisz, pojawi się błąd kompilacji:
//@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { //... }
źródło