以编程方式加载UITableViewController而不使用Storyboard

时间:2016-04-29 19:21:51

标签: ios swift uitableview

我正在尝试从UITableViewController启动AppDelegate作为RootController而不使用Storyboard。

这是我的TasksTableViewController:

class TasksTableViewController: UITableViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

    }

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

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

nib文件名为TasksTableViewControllerTasksTableViewController的view属性连接到nib上的UITableView控件。

AppDelegate看起来像这样:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        window = UIWindow(frame: UIScreen.mainScreen().bounds)

        let controller = TasksTableViewController(nibName: "TasksTableViewController", bundle: nil)
        window?.rootViewController = controller

        window?.makeKeyAndVisible()
        return true
    }

我看到的只是黑屏。没有数据绑定到UITableView控件,但我希望看到一个空的uiTableview控件而不是黑屏。我做错了什么?

更新

以下是使其正常运行的代码:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)


        let controller = TasksTableViewController(nibName: "TasksTableViewController", bundle: nil)

        if let window = self.window {
            window.backgroundColor = UIColor.blueColor()
            window.rootViewController = controller
            window.makeKeyAndVisible()
        }

        return true
    }

1 个答案:

答案 0 :(得分:1)

尝试这种方式:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let controller = TasksTableViewController(nibName: "TasksTableViewController", bundle: nil)

     if let window = self.window{
        window.rootViewController = controller
     }
}

在将其添加到窗口之前,确认已创建正确的断点。此外,没有理由在启动时实例化新窗口,所以不要这样做。此时,通过在viewDidAppear中放置断点,仔细检查VC是否实际显示。考虑将TasksTableViewController作为UIViewController的子类,其中包含一个tableview,因为这是常见的做法。通常不推荐对UITableView进行子类化,也不将其用作ViewController。如果您在要使用的xib中布置了自定义tableview,则可以在视图中实例化一个在根视图控制器上执行load或init,将其添加为子视图,并将框架设置为覆盖整个屏幕。我强烈推荐这种方法。