Ich versuche, eine objektorientierte iOS-App zu erstellen, und ich habe Probleme beim Aufrufen einer Tabelle reload (UI-Interaktion) aus einer meiner schnellen Klassendateien.iOS ein UITableView von einer Swift-Klasse/Objekt neu laden
Wenn ich ohne Objekte arbeite und all diese Sachen in der ViewDidLoad-Methode meines InterfaceControllers schreibe, funktioniert alles ... aber nicht, wenn ich das in Klassen setze.
Ich verwende eine asynchrone Anfrage, um Json Daten von einem Webservice zu laden. Nach dem Empfang der Daten verwende ich diese Daten als Datenquelle für meine Tabellenansicht. Es scheint, dass die Tabellenansicht nach dem Start ohne Daten initialisiert wird. Daher ist es erforderlich, reload() in der Tabellenansicht aufzurufen, nachdem die Async-Anfrage abgeschlossen wurde.
sind also hier die Details:
Haupt TableController
import UIKit;
class DeviceOverview: UITableViewController {
@IBOutlet var myTableView: UITableView!
var myDevices = Array<String>();
var myDevicesSection = NSMutableDictionary()
var deviceObjects = Array<NSDictionary>();
var mappingSectionIndex = Array<String>();
var sharedUserDefaults = NSUserDefaults(suiteName: "group.barz.fhem.SharingDefaults")
// THIS IS AN ATTEMPT TO give the class itself as PARAMETER
// ALSO TRIED TO USE myTableView (IBOutlet)
var fhem :FHEM = FHEM(tableview : self)
override func viewDidLoad() {
super.viewDidLoad()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return self.fhem.sections.count
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var devicesInSection : Array<NSDictionary> = self.fhem.sections[self.fhem.mappingSectionIndex[section]] as! Array<NSDictionary>
return devicesInSection.count;
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("device", forIndexPath: indexPath) as! TableViewCell
let sectionName : String = fhem.mappingSectionIndex[indexPath.section]
if let devices : Array<NSDictionary> = self.fhem.sections.objectForKey(sectionName) as? Array<NSDictionary> {
let device = devices[indexPath.row]
var alias : NSString?;
if let attr : NSDictionary = device.objectForKey("ATTR") as? NSDictionary {
alias = attr.objectForKey("alias") as? String
}
if (alias != nil) {
cell.deviceLabel.text = alias as? String
}else{
if let deviceName : String = device.objectForKey("NAME") as? String {
cell.deviceLabel.text = deviceName
}
}
}
return cell
}
FHEM Klasse
import UIKit
class FHEM: NSObject {
var devices : [NSDictionary]
var sections : NSMutableDictionary
var deviceNames : [String]
var mappingSectionIndex : [String]
var myTableViewController : DeviceOverview
init(tableview : DeviceOverview){
self.devices = Array<NSDictionary>()
self.sections = NSMutableDictionary()
self.deviceNames = Array<String>()
self.mappingSectionIndex = Array<String>()
self.myTableViewController = tableview
super.init()
let url = NSURL(string: "xyz");
var request = NSURLRequest(URL: url!);
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
(response, data, error) in
if let jsonData: NSData? = data {
// do some great stuff
//
// this is an attempt to call the table view to reload
self.myTableViewController.myTableView.reloadData()
}
}
}
}
Es wirft Fehler kompilieren, wenn ich versuche, die self
Variable in den Konstruktor meines Konstruktor zu setzen
var fhem :FHEM = FHEM(tableview : self)
Es ist nicht auch funktionieren, wenn ich die UITableView
direkt in den Konstruktor
var fhem :FHEM = FHEM(tableview : myTableView)
Am setzen versuche ich entlang komplett falschen Weg zu Fuß Objekte und die Interaktion mit dem ui verwenden?
Sie können eine Benachrichtigung für Ihre Tabellenansicht neu laden und fügen Sie einen Beobachter zu Ihrem TableView-Controller, um die reloadData dort auslösen –
Intersting, haben Sie ein Beispiel? – Barzille