我已经将一个空项目从ObjC移植到Swift(我知道我可以用swift开始,但是为了这个问题,让我们假设这不是一个选项)
我删除了ObjC类,包括main
文件,并将其替换为简单的AppDelegate.swift
和ViewController.swift
:
AppDelegate.swift:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
return true
}
}
ViewController.swift:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("ViewController")
}
}
我确保我的初始故事板使用了ViewController类型的UIViewController。
事情正在编译好但应用程序没有启动,AppDelegate didFinishLaunchingWithOptions函数未被调用,并且没有可见的视图。我想我不得不告诉Xcode新的入口点是AppDelegate.swift
,我希望@UIApplicationMain
正在这样做。
对于更多上下文,我正在设置一个需要用目标C编写的pod,但我希望演示应用程序能够快速进行。我找不到通过cocoapods自动执行此选项的选项,因此我将所有内容设置为目标C并且我正在尝试将演示应用程序移动到swift。我没有手动更改任何构建设置。
答案 0 :(得分:0)
我最终解决了清理构建并向应用委托添加窗口属性的问题......
AppDelegate需要var window: UIWindow?
属性。这是在Objective C版本中出现的,我愚蠢地忘了把它放在swift版本中。在清理构建文件夹之后,Xcode开始抱怨没有这样的属性,我把它放回去了。
启动时应设置此window
属性,以及应该是故事板中的根视图控制器。这一部分不是在Objective C版本中工作得很好而且很明显:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
return YES;
}
所以我现在有:
// AppDelegate.swift
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateInitialViewController()
window?.makeKeyAndVisible()
return true
}
}
并且有效