框架 ViewController 视图未显示

Framework ViewController View Not showing

我正在尝试创建一个包含视图控制器的框架 (Login VC)。我已成功导入框架并显示 VC,但未显示视图。我在导入的 viewDidLoad 中有一个打印功能,它正在打印。我错过了什么?

框架VC:

public class LoginVC: UIViewController {

    @IBOutlet weak var button: UIButton! {
        didSet {
            button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        }
    }

    public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override public func viewDidLoad() {
        super.viewDidLoad()
        print("View Loaded") // Firing
    }

    @objc func buttonPressed() {
        print("hello")
    }

}

框架VC Xib:

这是我展示框架时的视图调试器VC

-- 更新:这就是我展示 VC ---

的方式
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    let homeViewController = LoginVC()
    homeViewController.view.backgroundColor = UIColor.white
    window!.rootViewController = homeViewController
    window!.makeKeyAndVisible()
    return true
}

-- 更新--

由于很多评论都与应用程序代理有关,我先介绍一个通用的 ViewController,然后再介绍我的登录框架 VC。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    let homeViewController = ViewController()
    homeViewController.view.backgroundColor = UIColor.white
    window!.rootViewController = homeViewController
    window!.makeKeyAndVisible()
    return true
}


class ViewController: UIViewController {

   @IBOutlet weak var button: UIButton! {
       didSet {
           button.addTarget(self, action: #selector(presentNext), for: .touchUpInside)
       }
   }

    @objc func presentNext() {
        let loginVC = LoginVC()
        present(loginVC, animated: true, completion: nil)
    }

}

现在,当我显示登录框架时,我得到的只是黑屏。

-- 更新--

我可以在 viewdidLoad 中更改视图的背景颜色,但是 xib 视图没有显示。这是为什么?..

您需要在 ViewController 实际出现后调用您的 presentNext() -- 不在 viewDidLoad,甚至 viewWillAppear.

像这样:

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        presentNext()
    }
    @objc func presentNext() {
        let loginVC = LoginVC()
        present(loginVC, animated: true, completion: nil)
    }

}

这是工作测试项目:

https://github.com/drewster99/SO_LoginVC

此外,也许仔细检查您的 ViewController.xib 是否实际为按钮附加了 IBOutlet。实际上必须是这样。其他一切看起来都不错。

这是我得到的:

AppDelegate:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow(frame: UIScreen.main.bounds)
        let homeViewController = ViewController()
        homeViewController.view.backgroundColor = UIColor.white
        window!.rootViewController = homeViewController
        window!.makeKeyAndVisible()
        return true
    }
}

ViewController.swift:

import UIKit
import LoginFrameworkThing

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton! {
        didSet {
            button.addTarget(self, action: #selector(presentNext), for: .touchUpInside)
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }

    @objc func presentNext() {
        print("Presenting next...")
        let loginVC = LoginVC()
        present(loginVC, animated: true, completion: nil)
    }
}

按钮连接在ViewController,框架中存在LoginVC(.xib和.swift)。

我更新了示例项目。检查 link.

xibs 连接到 viewController 的框架需要从包中显式加载。

通常我们用xib创建一个cocoaTouch UIViewController的时候,这个是帮我们处理的。但是使用frameworks的时候,没有处理

为了解决这个问题,我在 viewDidLoad

中添加了加载 xib
override func viewDidLoad() {
    super.viewDidLoad()

    // Frameworks require loading of the xib to connect xib to view controller
    let bundle = Bundle(for: type(of: self))
    bundle.loadNibNamed("viewControllerName", owner: self, options: nil)
}