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
wo rufst du diese Funktion von einer anderen Klasse an? – 3stud1ant3
Niemals Lifecycle-Ereignisse des View-Controllers aufrufen, z. B. 'viewWillAppear'. – Paulw11
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