2016-04-29 18 views
0

Ich versuche, einen UITableViewController als RootController von AppDelegate ohne Storyboards zu starten.Programmgesteuertes Laden von UITableViewController ohne Storyboards

Hier ist meine 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) 
    } 

Die NIB-Datei TasksTableViewController genannt wird. Die Ansichtseigenschaft der TasksTableViewController ist an eine UITableView Steuerung an der Spitze angeschlossen.

Die AppDelegate sieht wie folgt aus:

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 
    } 

Ich sehe ein schwarzer Bildschirm. Es gibt keine Datenbindung an die UITableView Kontrolle, aber ich hatte gehofft, ein leeres uiTableview-Steuerelement zu sehen und nicht den schwarzen Bildschirm. Was mache ich falsch?

UPDATE:

Hier ist der Code, es funktioniert habe:

@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 
    } 
+0

Es sollte auch genug sein, um 'nil' an' nibName' zu ​​übergeben. Überprüfen Sie Ihre 'Info.plist' - es gibt einige Eigenschaften, die erzwingen, dass window & root controller vom Storyboard geladen wird und sie müssen deaktiviert sein, wenn Sie Ihr Projekt aus einer Storyboard-Vorlage erstellt haben. – Sulthan

+0

Ich würde auch empfehlen, eine Hintergrundfarbe zu Fenster und eine Hintergrundfarbe zu Ihrem Controller zu setzen. Das sollte dir sagen, was das Problem ist. – Sulthan

+0

Ich denke, Sie müssen eine Datenquelle definieren und die Tabelle view.count –

Antwort

1

Probieren Sie etwas von dieser Art:

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

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

Setzen Sie in Bruchstellen, um zu bestätigen, dass es vor dem Hinzufügen zum Fenster ordnungsgemäß erstellt. Außerdem gibt es keinen Grund, ein neues Fenster beim Start zu instanziieren, also tu das nicht. An diesem Punkt überprüfe, ob der VC tatsächlich angezeigt wird, indem du einen Haltepunkt in viewDidAppear platzierst. Erwägen Sie, TasksTableViewController zu einer Unterklasse von UIViewController zu machen, in der sich eine Tabellenansicht befindet, wie dies allgemein üblich ist. Das Subclassing von UITableView wird normalerweise nicht empfohlen und wird auch nicht als ViewController verwendet. Wenn Sie eine benutzerdefinierte Tabellenansicht in einer XIB erstellt haben, die Sie verwenden möchten, können Sie eine in view load oder init auf dem Stammansicht-Controller instanziieren, sie als Unteransicht hinzufügen und den Rahmen so einstellen, dass er den gesamten Bildschirm verdeckt. Ich empfehle diesen Ansatz sehr.

+0

Danke! Ich habe versucht, aber ich sehe immer noch einen schwarzen Bildschirm. Die Ereignisse viewDidLoad und viewDidAppear werden nicht einmal auf dem Controller ausgelöst. –

+0

Ich habe den Originalcode aktualisiert, um zu zeigen, wie ich es funktionierte. –

Verwandte Themen