一尘不染

使用Swift的UIApplication子类

swift

在Objective C中很简单:只需更新main.m文件并更改UIApplicationMain()参数即可

return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));

但是由于该指南指出,因此没有main.m文件

“在全局范围内编写的代码被用作程序的入口点,因此您不需要主要功能。”

那么,如何快速将UIApplication子类化?有什么建议吗?


阅读 315

收藏
2020-07-07

共1个答案

一尘不染

注意: 如果您正在寻找以前的语法,请在2019年6月对XCode 10.1和Swift
5的语法进行了更新

好,我找到了解决方案

首先,我注意到,在AppDelegate.swift文件的顶部,有这行

@UIApplicationMain

由于该行在任何范围之外(在文件级别),因此将立即执行,并且我假设编译器将其转换为标准的main函数。

因此,我从一个新的Swift-Only应用程序开始执行此操作:

  • 注释掉 @UIApplicationMain
  • 像这样添加了一个main.swift文件(FLApplication是我的子类)。
    重要
    文件必须命名为main.swift,因为其他文件不支持顶级语句!您不能在任何其他文件中添加UIApplicationMain()调用,否则将收到此错误:

不允许在顶层使用表达式

这是main.swift文件

UIApplicationMain(
    CommandLine.argc, CommandLine.unsafeArgv, 
    NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)

然后,使用以下代码为UIApplication子类FLApplication.swift创建一个swift文件:

import UIKit
import Foundation

class FLApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
        print("send event")
    }
}

现在,UIApplication已正确子类化,您将在日志中看到“发送事件”消息


旧版本
供参考,由于此版本从版本1到版本3发生了很大变化,因此我将所有以前的编辑保留在此处


编辑-2015年3月

正如UIApplicationMain胡俊峰所评论的那样,有关和main.swift文件的说明已记录在《
Swift语言参考:链接》的
“属性”部分中

正如Thomas Verbeek在XCode 6.3
Beta中所评论的那样,您可能会发现C_ARGC和C_ARGV已分别重命名为Process.argc和Process.unsafeArgv。您在main.swift文件中的UIApplicationMain调用将需要更新为:

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))

XCode 8之前的语法是

import Foundation
import UIKit

UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))

编辑-2016年12月

Beta 6之前的Xcode 8解决方案

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)
)
2020-07-07