使用Swift子类UIApplication

 没有水的鱼0713 发布于 2023-01-11 19:51

在Objective C中很简单:更新main.m文件并更改UIApplicationMain()参数就足够了

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

但是在swift中没有main.m文件,因为指南说

"在全局范围编写的代码用作程序的入口点,因此您不需要主函数."

那么,如何在swift中继承UIApplication?有什么建议吗?

1 个回答
  • 好的,我找到了解决方案首先,我注意到,在AppDelegate.swift文件的顶部,有这一行

    @UIApplicationMain
    

    由于这一行在任何范围之外(它在文件级别),它立即执行,我假设编译器将其转换为标准主函数.

    所以,我这样做了,从一个新的Swift-Only应用程序开始:

    评论说 @UIApplicationMain

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

    顶级不允许使用表达式

    这是main.swift文件

    注意在2018年9月的XCode 10中已经更新了语法 - 如果您正在寻找之前的语法,请查看编辑部分的亚特答案.

    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胡俊峰评论的那样,关于和.sift文件的解释记录在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))
    

    pre-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)
    )
    

    2023-01-11 19:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有