当前位置: 首页 > 面试题库 >

使用Swift的UIApplication子类

江佐
2023-03-14
问题内容

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

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

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

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

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


问题答案:

注意: 如果您正在寻找以前的语法,请在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)
)


 类似资料:
  • UIApplication 的核心作用是提供了 iOS 程序运行期间的控制和协作工作。 每一个程序在运行期必须有且仅有一个 UIApplication(或则其子类)的一个实例。在程序开始运行的时候,UIApplicationMain 函数是程序进入点,这个函数做了很多工作,其中一个重要的工作就是创建一个 UIApplication 的单例实例。在你的代码中你,你可以通过调用 [UIApplicat

  • 问题内容: 考虑两个类。第一个是,其子类符合: 第二类继承自: 该代码无法编译,因为: 使用元类型值构造“ Vehicle”类类型的对象必须使用“ required”初始化程序。 因此,我继续添加所需的初始化程序: 现在,应用程序可以编译,并且对象可以正确响应。 两个问题: 为什么构造具有元类型的对象需要初始化程序?(看来我编写的初始化程序没有任何作用。) 我写错了什么,还是 应该 添加到初始化程

  • 问题内容: 我有一个字符串数组,我正在尝试通过Firebase填充它。它是一个聊天应用程序,当用户创建房间时,他或她将房间命名。当用户登录并进入登录页面时,它会查询他或她正在参与的所有房间,我希望该房间能填充表格视图。在firebase文档中,我找到了childrenCount,但似乎无法正常工作。到目前为止,这是我尝试过的 我得到一个错误,即计数是仅获得属性。我如何填充该数组计数? 问题答案:

  • 问题内容: 我想子类化并显示类似视图的登录名。我已经在Objective- C中创建了它,但是现在我想将其移植到Swift。我不使用情节提要,所以我用代码创建了所有UI。 但是第一个问题是我必须执行。我给了它一个默认的实现,因为它不会被调用。现在,当我运行程序时,它崩溃了,因为我也必须实现。现在我得到了: 我的问题是我应该在哪里创建文本字段等…,如果我从不实现框架和编码器,该如何“隐藏”呢? 问题

  • 问题内容: 我的 TapCell1.swift 这是习惯 我的 ViewController.swift 正确设置了其所有数据源和代理。但是未显示我的自定义单元格。 问题是我的自定义单元格未显示。请提出我做错的任何事情。 注意:这是我的代码 我的文件下载链接 问题答案: 我终于做到了。 对于TapCell1.swift 对于NextViewController.swift 我的工作代码链接:自定义

  • 问题内容: 在我的项目中,我在UICollectionViewCell中创建了Cell 由于未捕获的异常,其出现了“错误终止”应用程序 代码如下。 GalleryCell.swift 我在My ViewController中使用了该单元格: 代码如下: NextViewController.swift } 我的问题是我遇到以下错误: 问题答案: 我加入以下两行下: 问题是我没有注册笔尖。现在我正在