将项目从ObjC移植到Swift后,应用程序无法启动

时间:2017-05-31 06:56:31

标签: ios swift

我已经将一个空项目从ObjC移植到Swift(我知道我可以用swift开始,但是为了这个问题,让我们假设这不是一个选项)

我删除了ObjC类,包括main文件,并将其替换为简单的AppDelegate.swiftViewController.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。我没有手动更改任何构建设置。

1 个答案:

答案 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
  }
}

并且有效