Was bedeutet "@UIApplicationMain"?

81

Ich habe gerade mein erstes Swift-Projekt erstellt. In der AppDelegate.swiftZeile über einer Klassendeklaration befindet sich eine Zeile - warum ist sie dort?!

...
import UIKit
import CoreData

@UIApplicationMain // <- WHY IS IT HERE?
class AppDelegate: UIResponder, UIApplicationDelegate {
... 
János
quelle

Antworten:

131

Das @UIApplicationMainAttribut in Swift ersetzt die triviale main.mDatei in Objective-C-Projekten (deren Zweck darin besteht, die mainFunktion zu implementieren , die der Einstiegspunkt für alle C-Programme ist, und den Aufruf UIApplicationMainzum Starten der Cocoa Touch-Ausführungsschleife und der App-Infrastruktur).

In Objective-C ist das Hauptbit (heh) der Konfiguration pro App, das die UIApplicationMainFunktion bereitstellt, das Festlegen einer der benutzerdefinierten Klassen Ihrer App als Delegat des gemeinsam genutzten UIApplicationObjekts. In Swift können Sie diese Klasse einfach festlegen, indem Sie das @UIApplicationMainAttribut zur Deklaration dieser Klasse hinzufügen . (Sie können die UIApplicationMainFunktion auch weiterhin direkt aufrufen, wenn Sie Grund dazu haben. In Swift fügen Sie diesen Aufruf in Code der obersten Ebene in eine main.swiftDatei ein.)

@UIApplicationMainist nur für iOS. In OS X wird der App-Delegat traditionell in der von der Info.plist angegebenen Haupt-Nib-Datei festgelegt (das gleiche für Swift wie für ObjC). Bei OS X-Storyboards gibt es jedoch keine Haupt-Nib-Datei @NSApplicationMain.

Rickster
quelle
1
Auf Seite 58 in The Swift Programming Language fand ich den Abschnitt Attribute interessant.
János
1
Ich hätte die Dokumente in meiner Antwort zitiert, aber für dieses Attribut scheint es noch keine zu geben. Die Attribute - Seite zu finden ist , wo Sie wahrscheinlich würde es finden.
Rickster
3
Eine Beschreibung für UIApplicationMaingibt es jetzt. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Quinn Taylor
2
Beachten Sie in Bezug auf Ihren letzten Satz, dass OS X das entsprechende @NSApplicationMain
Bill
@UIApplicationMain ist auch für tvOS
Shaked Sayag
7

Das @ UIApplicationMain-Attribut ersetzt die Datei main.m und den Einstiegspunkt für den Start Ihrer Anwendung.

Eine weitere Sache, die Ihr Programm ohne diese @UIApplicationMain ausführen kann, ist lediglich ein Kommentar // @ UIApplicationMain` create main.swift wie main.m in Ziel c und schreiben Sie den folgenden Code. Dies ist der Einstiegspunkt Ihrer Bewerbung

import Foundation
class FLApplication: UIApplication
{
    override func sendEvent(event: UIEvent!)
    {
        println("Entry Point") // this is an example
    }
}
Priyanka
quelle
1
Wenn ich das mache, wird es kompiliert und ausgeführt, aber nach der Installation der App beendet und sendEvent wird nie aufgerufen. Na und? :)
StuFF mc
Weitere Infos hier: stackoverflow.com/questions/24020000/… - aber wieder lande ich nicht in sendEvent ...
StuFF mc
@StuFFmc danke für diese Info. Die sendEvent-Methode wurde auch für mich nicht aufgerufen.
dellos
2
Der FoundationImport, die FLApplication, die zufällige Unterklasse, ohne die Verwendung der Unterklasse zu deklarieren ... Entschuldigung, aber keine dieser Antworten ist sinnvoll, außer dem ersten Satz.
Ephemer
7

Die Quelldatei AppDelegate.swift hat zwei Hauptfunktionen:

  • Es erstellt den Einstiegspunkt für Ihre App und eine Ausführungsschleife, die Eingabeereignisse an Ihre App liefert. Diese Arbeit wird vom UIApplicationMain- Attribut (@UIApplicationMain) ausgeführt , das oben in der Datei angezeigt wird . UIApplicationMain erstellt ein Anwendungsobjekt, das für die Verwaltung des Lebenszyklus der App verantwortlich ist, und ein App-Delegatenobjekt.

  • Es definiert die AppDelegate- Klasse, die Blaupause für das App-Delegatenobjekt. Der App-Delegat erstellt das Fenster, in dem der Inhalt Ihrer App gezeichnet wird, und bietet einen Ort, an dem auf Statusübergänge innerhalb der App reagiert werden kann. In der AppDelegate-Klasse schreiben Sie Ihren benutzerdefinierten Code auf App-Ebene.

Tharindu
quelle
Hey @Manju ....... Ich habe meine UIApplication main als TimerUiApplication überschrieben ............. Ich habe eine Variable darin .......... Wie mache ich das? Ändern Sie diese Variable meiner UIApplication von meinem uiViewController .....................
Cloy
3

Nachdem die Swift-Dokumentation aktualisiert wurde, finden Sie hier die entsprechende Passage:

NSApplicationMain

Wenden Sie dieses Attribut auf eine Klasse an, um anzugeben, dass es sich um den Anwendungsdelegierten handelt. Die Verwendung dieses Attributs entspricht dem Aufrufen der Funktion NSApplicationMain ( : :) und der Übergabe des Klassennamens als Name der Delegatenklasse.

Wenn Sie dieses Attribut nicht verwenden, geben Sie eine Datei main.swift mit einer Funktion main () an, die die Funktion NSApplicationMain ( : :) aufruft . Wenn Ihre App beispielsweise eine benutzerdefinierte Unterklasse von NSApplication als Hauptklasse verwendet, rufen Sie die Funktion NSApplicationMain auf, anstatt dieses Attribut zu verwenden.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html

William Entriken
quelle
0

@UIApplicationMain ist ein Attribut, das auf die unten deklarierte Klasse AppDelegate angewendet wird, um weitere Informationen zu dieser Klasse bereitzustellen.

In diesem Fall gibt das Attribut @UIApplicationMain an, dass die Klasse AppDelegate der Anwendungsdelegierte Ihrer App ist.

ERN
quelle
0

UIApplicationMain Wenden Sie dieses Attribut auf eine Klasse an, um anzugeben, dass es sich um den Anwendungsdelegierten handelt. Die Verwendung dieses Attributs entspricht dem Aufrufen der UIApplicationMain-Funktion und der Übergabe des Klassennamens als Name der Delegatenklasse. (Quelle)

michaelI
quelle