2016-03-22 10 views
2
nicht entfernen

Ich arbeite an einem Projekt für iOS in Swift. Diese App beinhaltet die Anzeige von JSON-Daten in einem UITableView.Swift - UITableView 'kann eine Zelle mit dem Bezeichner Cell'

Ich habe die JSON-Daten analysiert und alles, aber es wird nicht in der Tabellenansicht angezeigt. Wann immer ich meine app laufen sie mir diesen Fehler gibt:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

Ich versuche, alles zu tun, programmatisch stattdessen die Storyboards zu verwenden. Ich werde meinen Code unten hinzufügen.

import UIKit 
import Foundation 

class TableViewController: UITableViewController 
{ 
    var postsCollection = [Post]() 
    var service: PostService! 

    override func awakeFromNib() 
    { 
     super.awakeFromNib() 
    } 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     service = PostService() 
     service.getPosts 
     { 
      (response) in 
      self.loadPosts(response["Events"]! as! NSArray) 
     } 
    } 

    func loadPosts(events: NSArray) 
    { 
     for event in events 
     { 
      //var event = event["Events"]! as! NSDictionary 
      print("\n-----------------------------------------------------") 
      print("   RECEIVED_JSON_DATA") 
      print("-----------------------------------------------------") 
      print("Title    : \(event["Title"])") 
      print("Event Description : \(event["EventDescription"])") 
      print("Event Location  : \(event["EventLocation"])") 
      print("Event StartTime : \(event["EventStartTime"])") 
      print("Event EndTime  : \(event["EventEndTime"])") 
      print("RowKey    : \(event["RowKey"])") 
      print("-----------------------------------------------------\n") 

      var title = event["Title"]! as! String 
      var description = event["EventDescription"]! as! String 
      var location = event["EventLocation"]! as! String 
      var startTime = event["EventStartTime"]! as! String 
      var endTime = event["EventEndTime"]! as! String 
      //var eventURL = event["EventURL"]! as! String 
      var rowKey = event["RowKey"]! as! String 

      //var postObj = Post(title: title, description: description, location: location, startTime: startTime, endTime: endTime, eventURL: eventURL, rowKey: rowKey) 
      var postObj = Post(title: title, description: description, location: location, startTime: startTime, endTime: endTime, rowKey: rowKey) 

      postsCollection.append(postObj) 
     } 

     dispatch_async(dispatch_get_main_queue()) 
     { 
      self.tableView.reloadData() 
     } 
    } 

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

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return postsCollection.count 
    } 

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

     cell.textLabel!.text = object.title 

     return cell 
    } 

    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool 
    { 
     // Return false if you do not want the specified item to be editable. 
     return true 
    } 
} 

Kann mir jemand dabei helfen und mir zeigen, wo ich falsch liege?

Danke!

+0

Wie ich schon sagte, versuche Im alles zu tun programmatisch statt Storyboards verwenden. Gibt es eine andere Möglichkeit, ohne Storyboards oder Xib zu verwenden? – ADuggan

+0

Tatsächlich teilt Ihnen die Fehlermeldung mit, was zu tun ist: *** muss ** eine Feder oder ** eine Klasse für den Bezeichner *** registrieren – vadian

+0

Wenn der Zellprototyp nicht zu dem _tableView_- oder _collectionView-Ausgang in IB hinzugefügt wird. One ** muss ** die Zelle Nib vor dem Entfernen der Warteschlange registrieren :) –

Antwort

8

Stellen Sie sicher, dass irgendwo (wahrscheinlich in Ihrem viewDidLoad (Ich sagte vorher init, geändert aufgrund Kommentar)), können Sie die Zelle Klasse registrieren:

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

'viewDidLoad' ist ein besserer Ort dafür, wenn subclassin' UITableViewController' – Losiowaty

+0

Würde dies Doppelregistrierung verursachen, wenn eine vorhandene Instanz von 'UITableViewController' die Ansicht wieder geladen hätte? – BallpointBen

+0

Nun, ich habe keinen Fall gesehen, wenn eine existierende Instanz eine View wieder geladen hat und soweit ich weiß, wäre das ein viel gravierenderer Fehler, da dies zu Speicherlecks führen könnte. – Losiowaty

0

Bitte verwenden:

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

in viewDidLoad func und teilen Sie uns das Ergebnis mit.

0

Verwenden register statt registerClass in Swift 4.

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") 
Verwandte Themen