我正在尝试构建一个面向对象的iOS应用程序,但是从一个我的swift类文件调用表重新加载(ui交互)时遇到了问题。
如果我在没有对象的情况下工作,并在InterfaceController的viewDidLoad方法中编写所有内容,则一切正常…但是如果我将其放入类中则不行。
我正在使用异步请求以便从Web服务加载json数据。接收到数据后,我将这些数据用作表视图的数据源。似乎tableview是在启动后初始化的,没有数据,因此必须在完成异步请求之后在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() } } } }
如果我尝试将self变量放入构造函数的构造函数中,则会引发编译错误
self
var fhem :FHEM = FHEM(tableview : self)
如果我尝试将UITableView直接放入构造函数中,它也将不起作用
UITableView
var fhem :FHEM = FHEM(tableview : myTableView)
我是否在使用对象并与ui交互时走完全错误的道路?
您只需在异步任务完成后发布通知:
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() }