用Swift子类化UIApplication

9 浏览
0 Comments

用Swift子类化UIApplication

在Objective C中,很简单:只需要更新main.m文件并更改UIApplicationMain()的参数\nreturn UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));\n但在Swift中没有main.m文件,因为指南中说\n“在全局范围编写的代码用作程序的入口点,因此不需要main函数。”\n那么,在Swift中如何子类化UIApplication呢?有什么建议吗?

0
0 Comments

Swift中使用子类继承UIApplication的问题出现的原因是在使用UIApplicationMain()函数时,需要传入UIApplication类名和UIApplicationDelegate类名作为参数,但默认的AppDelegate类中存在顶级代码,不符合使用UIApplicationMain()函数的要求。因此,需要创建一个自定义的UIApplication子类来解决这个问题。

解决方法如下:

1. 首先,创建一个名为CustomUIApplication的UIApplication子类,并在其中添加自己的逻辑。

import UIKit

class CustomUIApplication: UIApplication {

override func sendEvent(_ event: UIEvent) {

super.sendEvent(event)

}

}

2. 接下来,创建一个名为main.swift的文件,并在其中调用UIApplicationMain()函数,这是应用程序的新入口点,由操作系统调用。该函数接收参数:命令行参数数目、不安全的命令行参数、自定义的UIApplication子类名(在步骤1中创建的)、AppDelegate类名,并启动主运行循环。

import UIKit

UIApplicationMain(

CommandLine.argc,

CommandLine.unsafeArgv,

NSStringFromClass(CustomUIApplication.self), //在步骤1中创建的

NSStringFromClass(AppDelegate.self)

)

3. 最后,将默认的AppDelegate类中的注释移除,以便正常使用。

class AppDelegate: UIResponder, UIApplicationDelegate {

//...

}

如果不进行以上步骤,将会出现编译错误:

UIApplicationMain attribute cannot be used in a module that contains top-level code

通过以上步骤,我们成功解决了Swift中使用子类继承UIApplication的问题。

0
0 Comments

问题的原因是在对UIApplication进行子类化时,可能会遇到一些限制和问题。但是,可以通过扩展UIApplication来解决这些问题。根据苹果发布的iBook中的内容,Swift中的扩展可以添加计算属性、定义实例方法和类型方法、提供新的初始化方法、定义下标、定义和使用新的嵌套类型以及使现有类型符合协议。

解决方法是使用扩展来替代子类化UIApplication。通过扩展,可以利用Swift提供的丰富功能来满足对UIApplication的定制需求。这种方法可以避免子类化带来的一些限制和问题,并且可以更加灵活地对UIApplication进行功能扩展。

通过扩展UIApplication,可以添加自定义的计算属性、实例方法、类型方法、初始化方法、下标等。还可以定义和使用新的嵌套类型,并使UIApplication符合特定的协议。

如果在子类化UIApplication时遇到一些限制和问题,可以考虑使用扩展来替代子类化,以获得更加灵活和强大的功能扩展能力。

0
0 Comments

问题:如何使用Swift中的函数UIApplicationMain()UIApplication进行子类化?

原因:在Swift 3之前,无法直接在AppDelegate.swift文件中调用UIApplicationMain()函数,因为它需要在main.swift文件中调用。这是因为UIApplicationMain()函数在Swift中是一个顶级语句,不能在其他文件中使用。因此,需要在main.swift文件中调用UIApplicationMain()函数。

解决方法:首先,在AppDelegate.swift文件的顶部,注释掉UIApplicationMain()函数。然后,在一个名为main.swift的新文件中调用UIApplicationMain()函数,并将UIApplication的子类和AppDelegate类作为参数传递给该函数。最后,在一个名为FLApplication.swift的文件中创建UIApplication的子类FLApplication,并在该子类中重写sendEvent()方法。

这样就解决了无法直接在AppDelegate.swift文件中对UIApplication进行子类化的问题,并且可以在子类中重写sendEvent()方法。

0