creare un UITableViewController a livello di programmazione in Swift

Sto cercando, come il titolo dice, impostare un UITableViewController a livello di programmazione. Dopo un paio di ore di prova spero che qualcuno mi possa aiutare. E, sì, mi aspiratore chirurgico estratto altri post su questo argomento:

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
    }

}

e l’appDelegate assomiglia a questo:

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
    }

L’esecuzione di un programma, ma non appena lo fa, ottengo il seguente errore:

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

Ho quindi modificato il MainViewController(style: UITableViewStyle.Plain) per MainViewController(nibName: nil, bundle: nil) ma poi ottengo il seguente errore di sintassi: Extra argument 'bundle' in call

Qualsiasi aiuto sarebbe molto apprezzato

  • Come si definisce il MainViewController classe?
  • Qual è la definizione per MainViewController? Sei eredita direttamente da UITableViewController? Si definisce qualsiasi initialisers?
  • Ho aggiornato il codice
InformationsquelleAutor Nilzone- | 2014-06-07

 

3 Replies
  1. 3

    Sto usando una sottoclasse di UITableViewController senza problemi, utilizzando la (nibName:bundle:) di forma, ma l’ho ignorata che nel mio sottoclasse. Ho provato a sostituire il mio sottoclasse con standard UITableViewController, e ancora lavorato bene. Sei forse l’override di un init(…) metodo in una sottoclasse?

    • Quando ho rimosso la funzione init in MainViewController il programma eseguito bene. Ho appena trovato su un post qui sul MODO con lo stesso problema (non so come non ho visto il post prima di postare..). Ma perché è così necessario?
    • assicurarsi che si sta chiamando appropriato ereditato init(…) il metodo dal proprio inizializzatore.
    • Swift rende ereditato gli inizializzatori inaccessibile per i clienti della classe derivata quando si aggiunge un inizializzatore designato. Sembra simile a privato di ereditarietà in C++ in cui i metodi ereditati/dati sono implicitamente spostato in “privato” sezione di classe. Il motivo è semplice: se c’è un initializer allora la classe richiede probabilmente questo inizializzatore di costruire in classe “invariante”. Ma c’è un bug: se si crea classe derivata da UITableViewController e aggiungere initializer che chiama super.init(stile:) avrà esito negativo con il uso della implementate inizializzatore di ‘init(nibName:bundle:)’
  2. 3

    In AppDelegate o dovunque si chiama il 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
    }

    In UITableViewController (supponendo che non personalizzato TableViewCell attuazione):

    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]
      }

    Per un esempio completo: visita: https://github.com/ericcgu/EGStormTracker

  3. 0

    Ho appena rimozione

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

    e poi init come questo:

     let mainViewController: UITableViewController = MainViewController()

Lascia un commento