iOS从Swift类/对象重新加载UITableView

我正在试图build立一个面向对象的iOS应用程序,我有一个问题,从我的一个Swift类文件调用表重新加载(UI交互)。

如果我的工作没有对象,并在我的InterfaceController的viewDidLoad方法中写入所有的东西,一切正常……但不是如果我把它放到类中。

我正在使用asynchronous请求,以从Web服务加载JSON数据。 接收到数据后,我使用这些数据作为我的表格视图的数据源。 看起来tableview是在没有数据启动的情况下初始化的,因此在完成asynchronous请求之后,需要在tableview上调用reload()。

所以这里是细节:

主表控制器

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类

 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() } } } } 

它会抛出编译错误,如果我尝试把selfvariables放入我的构造函数的构造函数

 var fhem :FHEM = FHEM(tableview : self) 

如果我尝试将UITableView直接放入构造函数中,它也不起作用

 var fhem :FHEM = FHEM(tableview : myTableView) 

我是否沿着使用对象的完整错误path行走并与用户界面进行交互?

您可以在asynchronous任务完成时发布通知:

 NSNotificationCenter.defaultCenter().postNotificationName("refreshMyTableView", object: nil) 

将观察者添加到您的DeviceOverview类方法viewDidLoad:

 NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshList:", name:"refreshMyTableView", object: nil) 

并添加将在您的DeviceOverview类中被触发的方法

 func refreshList(notification: NSNotification){ myTableView.reloadData() } 

嗨您可以使用上述答案中build议的通知,否则您可以使用委派来解决此问题

代表正在做这样的事情,但方式简单。

在这里你传递表视图控制器在你自定义class.this事情你可以做的委托。 在自定义类中创build自定义委托方法。 使用表视图控制器对象设置委托。

在这里你不需要把你的表视图的IBOutlet,因为你的控制器inheritance自表视图控制器,所以它的视图是表视图

 import UIKit class DeviceOverview: UITableViewController,FHEMDelegate { @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") var fhem :FHEM? // THIS IS AN ATTEMPT TO give the class itself as PARAMETER // ALSO TRIED TO USE myTableView (IBOutlet) override func viewDidLoad() { super.viewDidLoad() fhem = FHEM () fhem?.delegate = self } override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1; } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // var devicesInSection : Array<NSDictionary> = self.fhem!.sections[self.fhem!.mappingSectionIndex[section]] as Array<NSDictionary> return 5; } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("device", forIndexPath: indexPath) as UITableViewCell 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 } func reloadDataOfTable() { self.tableView.reloadData() } } 

FHEM

 import UIKit protocol FHEMDelegate{ func reloadDataOfTable() } class FHEM : NSObject { var devices : [NSDictionary] var sections : NSMutableDictionary var deviceNames : [String] var mappingSectionIndex : [String] //var myTableViewController : DeviceOverview var delegate :FHEMDelegate? override init(){ self.devices = Array<NSDictionary>() self.sections = NSMutableDictionary() self.deviceNames = Array<String>() self.mappingSectionIndex = Array<String>() self.delegate = nil super.init() let url = NSURL(string: "http://google.com"); 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.delegate?.reloadDataOfTable() } } } } 

这里在FHEM类中创build一个自定义委托方法reloadDataOfTable ,它在您的viewcontroller类中实现,因此当获得代码的响应时,会调用该方法和此方法(reloadDataOfTable)内容代码来重新载入表数据。

我不太了解Swift,但是我一直在为iOS编写Objective-C。 (至less在Objective-C中),你必须在访问self之前调用super init上的init ,否则你的对象没有正确初始化。 你也没有把self分配给super.init() ,这在Objective-C中是必须的,看起来它不在Swift中。

tl; dr – 将调用移到super.init()FHEM类的init方法的第一行。