создайте UITableViewController программно в Swift

Я пытаюсь, как говорится в заголовке, программно настроить UITableViewController. После нескольких часов попыток я надеюсь, что кто-то может помочь мне. И, да, я проверил другие сообщения по этому вопросу:

import UIKit

class MainViewController: UITableViewController {

    init(style: UITableViewStyle) {
        super.init(style: style)
        // Custom initialization
    }

    override func viewDidLoad() {
        super.viewDidLoad()


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // #pragma mark - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
        return 5
    }


    override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
        var cell = tableView?.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell

        if !cell {
            cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
        }
        cell!.textLabel.text = "test"
        return cell
    }

}

и appDelegate выглядит так:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        let mainViewController: UITableViewController = MainViewController(style: UITableViewStyle.Plain)
        let navigationController: UINavigationController = UINavigationController()
        navigationController.pushViewController(mainViewController, animated: false)

        self.window!.rootViewController = navigationController
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()
        return true
    }

программа запускается, но как только это происходит, я получаю следующую ошибку:

fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'HelloWorld.MainViewController'

затем я изменяю MainViewController(style: UITableViewStyle.Plain) to MainViewController(nibName: nil, bundle: nil) но затем я получаю следующую синтаксическую ошибку: Extra argument 'bundle' in call

любая помощь была бы очень признательна

3 ответов


Я использую подкласс UITableViewController без проблем, используя форму (nibName:bundle:), но я переопределил это в моем подклассе. Я попытался заменить свой подкласс стандартным UITableViewController, и он все еще работал нормально. Возможно, вы переопределяете init(...) метод в подклассе?


в AppDelegate или где вы вызываете TableViewController:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    if let window = window {
      window.backgroundColor = UIColor.whiteColor()
      var mainTableViewController = MainTableTableViewController(style: .Plain)
      window.rootViewController = UINavigationController(rootViewController: mainTableViewController)
      window.makeKeyAndVisible()
    }
    return true
}

в UITableViewController (при условии отсутствия пользовательской реализации TableViewCell):

import UIKit

class MainTableTableViewController: UITableViewController {

  override init(style: UITableViewStyle){
    super.init(style: style)
  }

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

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

  override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")

  }

  // MARK: - Tableview Data Source

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return [*YOUR_DATA_ARRAY].count
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel!.text = [*YOUR_DATA_ARRAY][indexPath.row]
  }

для полного примера: посетите:https://github.com/ericcgu/EGStormTracker


Я просто удалить

init(style: UITableViewStyle) {
    super.init(style: style)
}

а затем init так:

 let mainViewController: UITableViewController = MainViewController()