2017-12-04 2 views
0

Ich versuche, eine tableView während der Ausführung des Programms dynamisch zu aktualisieren. Ich glaube, ich habe das Array aktualisiert, dass die Daten Lasten von richtig, aber wenn ich die Taste drücken, die self.eventTable.reloadData() ruft ich die Fehlermeldung:"fataler Fehler" beim Aufrufen von tableView.ReloadData() ist die TabelleView ordnungsgemäß verbunden

fatal error: unexpectedly found nil while unwrapping an Optional value 

Hier ist der relevante Code:

-View-Controller:

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

//Timer view 
@IBOutlet weak var playButton: UIBarButtonItem!; 
@IBOutlet weak var pauseButton: UIBarButtonItem!; 
@IBOutlet weak var refreshButton: UIBarButtonItem!; 
@IBOutlet weak var timerLabel: UILabel! 

var counter = 0 
var timer = Timer() 
var isTimerRunning = false 

//testing view container 
var viewShowing = 1; 

override func viewDidLoad() { 

    // Do any additional setup after loading the view, typically from a nib. 
    pauseButton.isEnabled = false 

    hideAll(); 
    self.basicContainer.isUserInteractionEnabled = true; 
    self.basicContainer.isHidden = false; 

    self.timerLabel.text = String("00:00:00"); 

    eventTable.dataSource = self 
    eventTable.delegate = self 

    super.viewDidLoad()   
    loadEvents(event: "timer start") 
} 

...

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


// Add table to keep track of events 
@IBOutlet weak var eventTable: UITableView! 

var eventData = [Session]() 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return eventData.count; 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier") as! eventTableViewCell 
    let event = eventData[indexPath.row] 
    cell.eventLabel.text = event.session 
    return cell 
} 

private func loadEvents(event: String) { 
    guard let event1 = Session(session: event) else { 
     fatalError("Unable to instantiate event") 
    } 

    eventData += [event1] 

    DispatchQueue.main.async() { 
     self.eventTable.reloadData() 
    } 
} 

func testPrint() { 
    loadEvents(event: "testing cell adding") 
    //self.eventTable.reloadData() 
    viewWillAppear(false) 
    print("This is a test print"); 
} 

} 

Die Funktion funktioniert gut, wenn Es wird in ViewDidLoad() aufgerufen, aber nicht, wenn es von der Schaltfläche in einer anderen Klasse aufgerufen wird ("Dies ist ein Testausdruck", der auf die Konsole gedruckt wird, damit ich weiß, dass die Schaltfläche aufgerufen wird).

Erwartetes Verhalten ist das tableView (eventTable) Nachladen zeigt zwei Zellen, "Timer starten" und "Testzelle hinzufügen" (idealerweise mit "Testzelle hinzufügen" an der Spitze).

Auch möchte ich betonen, dass EventTable mit dem Storyboard verbunden ist, das hier ein häufiges Problem zu sein scheint.

Hier ist die Session.swift-Datei und die eventTableViewCell.swift Datei, wenn diejenigen nützlich sind:

Session.swift

import Foundation 
import UIKit 

class Session { 

//MARK: Properties 

var session: String 

//MARK: Initialization 

init?(session: String) { 

    guard !session.isEmpty else { 
     return nil 
    } 

    self.session = session 
} 

} 

eventTableViewCell.swift

import Foundation 
import UIKit 

class eventTableViewCell: UITableViewCell { 
//MARK: Properties 
@IBOutlet weak var eventLabel: UILabel! 

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

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
    // Configure the view for the selected state 
} 

} 

Dank!

Edit: Der ViewController von wo ich testPrint() aufrufen.

import UIKit 

class BasicViewController: UIViewController { 

var VC = ViewController(); 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
} 

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

//Basic buttons 
@IBOutlet weak var warmButton: UIButton! 
@IBOutlet weak var dryButton: UIButton! 
@IBOutlet weak var stimulateButton: UIButton! 
@IBOutlet weak var controlButton: UIButton! 
@IBOutlet weak var bedButton: UIButton! 
@IBOutlet weak var tempButton: UIButton! 
@IBOutlet weak var pulseButton: UIButton! 
@IBOutlet weak var ecgButton: UIButton! 
@IBOutlet weak var apgarButton: UIButton! 
@IBOutlet weak var helpButton: UIButton! 

//APGAR options 
@IBOutlet weak var skinColor: UIButton! 
@IBOutlet weak var pulse: UIButton! 
@IBOutlet weak var grimace: UIButton! 
@IBOutlet weak var flexion: UIButton! 
@IBOutlet weak var respiratoryEffort: UIButton! 



@IBAction func warmButton(sender: AnyObject) { 
    VC.testPrint(); 
} 
} 

Es scheint, dass alles in Ordnung sind in die besagt, dass ich einen neuen Viewcontroller bin instanziieren, die das Problem verursacht. Wie soll ich das beheben? Ziemlich neu zu Swift

+1

wo rufst du diese Funktion von einer anderen Klasse an? – 3stud1ant3

+1

Niemals Lifecycle-Ereignisse des View-Controllers aufrufen, z. B. 'viewWillAppear'. – Paulw11

+0

Wie @ 3stud1ant3 fragt, wo Sie den Knopf tippen tippen und wie rufen Sie die Funktion auf.Wahrscheinlich werden Sie eine neue Instanz Ihres View-Controllers instanziieren, die nicht mit der Storyboard-Szene verbunden ist. Daher ist Ihre Tabellenansicht null – Paulw11

Antwort

1

Ich denke, Ihr Problem ist in diesen Zeilen Code:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier") as! eventTableViewCell 
    let event = eventData[indexPath.row] 
    cell.eventLabel.text = event.session 
    return cell 
} 
  • Können Sie überprüfen die Zellenkennung ist das gleiche wie Ihre Zellenkennung
  • Und Nummer von Reihen in eventData Reihe
+1

... und 'eventLabel' ** outlet ** ist richtig eingestellt (Referenz ** nicht **' nil') –

+0

Ich glaube nicht, dass das das Problem ist. Diese Funktion funktioniert gut, wenn die Funktion zum ersten Mal in viewDidLoad() aufgerufen wird, sie hat nur Probleme beim zweiten Aufruf beim Drücken der Taste. – gannon96

+0

Verwenden Sie die Anweisungen 'if let' oder' guard', um optionale Werte auszupacken und den Haltepunkt zu setzen und herauszufinden, wo der tatsächliche Fehler liegt. –

Verwandte Themen