“ @UIApplicationMain”是什么意思?


82

我刚刚创建了我的第一个Swift项目,在AppDelegate.swift类声明的上方有一行-为什么在那儿呢?

...
import UIKit
import CoreData

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

Answers:


134

@UIApplicationMainSwift中的属性替换了main.m在Objective-C项目中找到的琐碎文件(其目的是实现main作为所有C程序的入口点并调用的功能)UIApplicationMain以启动Cocoa Touch运行循环和应用程序基础结构)。

在Objective-C中,该UIApplicationMain功能提供的每个应用程序配置的主要(heh)位是将应用程序的自定义类之一指定为共享UIApplication对象的委托。在斯威夫特,你可以很容易地通过添加指定这个类@UIApplicationMain属性到类的声明。(UIApplicationMain如果有必要,您仍然可以直接调用该函数。在Swift中,您可以将该调用放在main.swift文件的顶级代码中。)

@UIApplicationMain仅适用于iOS。在OS X中,传统上将应用程序委托设置在Info.plist指定的主nib文件中(对于Swift与ObjC相同),但是对于OS X故事板,没有主nib文件,因此@NSApplicationMain也存在相同的事情。


1
在“ Swift编程语言”的第58页上,我发现了“属性”部分,很有趣。
亚诺什

1
我会在答案中引用文档,但似乎此属性还没有任何文档。在找到的“属性”页面上可能找到它。
rickster


2
关于您的最后一句话,请注意,OS X具有等效的@NSApplicationMain
Bill

@UIApplicationMain也适用于tvOS
Shaked Sayag

7

@UIApplicationMain属性替代了main.m文件和入口,以启动您的应用程序。

如果没有这个@UIApplicationMain,程序可以工作的另一件事是注释// @ UIApplicationMain`在目标c中创建与main.m相同的main.swift并编写以下代码。那将是您应用程序的入口

import Foundation
class FLApplication: UIApplication
{
    override func sendEvent(event: UIEvent!)
    {
        println("Entry Point") // this is an example
    }
}

1
如果这样做,它将编译并运行,但是在安装应用程序后完成,并且永远不会调用sendEvent。所以呢?:)
StuFF mc 2014年

更多信息,在这里:stackoverflow.com/questions/24020000/…-但我又没有进入sendEvent ...
StuFF mc 2014年

@StuFFmc感谢您提供此信息。sendEvent方法也不适合我。
dellos

2
Foundation进口的FLApplication,没有任何使用子类的声明随机子类...很抱歉,但没有这个答案是有道理的,除了第一句。
星历

7

所述AppDelegate.swift源文件具有两个主要功能:

  • 它为您的应用程序创建入口点,并向您的应用程序传递输入事件的运行循环。这项工作由UIApplicationMain 属性(@UIApplicationMain)完成,该属性显示在文件顶部。UIApplicationMain创建一个负责管理应用程序生命周期的应用程序对象和一个应用程序委托对象。

  • 它定义了AppDelegate类,即应用程序委托对象的蓝图。应用程序委托将创建绘制应用程序内容的窗口,并提供一个位置来响应应用程序内的状态转换。AppDelegate类是您编写自定义应用程序级代码的地方。


嘿@Manju .......我已经将UIApplication主程序覆盖为TimerUiApplication .............我有一个变量.............从我的uiViewController修改我的UIApplication的变量.............
Cloy

3

现在,Swift文档已更新,下面是相关段落:

NSApplicationMain

将此属性应用于类以指示它是应用程序委托。使用此属性等效于调用NSApplicationMain( :)函数并将此类的名称作为委托类的名称传递。

如果不使用此属性,请为main.swift文件提供一个main()函数,该函数调用NSApplicationMain( :)函数。例如,如果您的应用程序使用NSApplication的自定义子类作为其主体类,请调用NSApplicationMain函数,而不要使用此属性。

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


0

@UIApplicationMain是应用于类-declared如下─一个属性 的AppDelegate,以提供关于这个类的更多信息。

在这种情况下,属性@UIApplicationMain指示类AppDelegate是您的应用程序的应用程序委托。


0

UIApplicationMain 将此属性应用于类以指示它是应用程序委托。使用此属性等效于调用UIApplicationMain函数并将此类的名称作为委托类的名称传递。 (资源)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.