从 UITableViewController 重新加载 tableView

Posted

技术标签:

【中文标题】从 UITableViewController 重新加载 tableView【英文标题】:reload tableView from UITableViewController 【发布时间】:2015-08-08 07:32:26 【问题描述】:

我正在尝试从 UItableViewController 重新加载我的 tableView,但它不起作用。 这是我得到的歌曲列表:

func request(params:[String])

    //soap envelop here with list of parameters reqquested


func response(response responseData: NSMutableData)

    var error: NSError?
    if let xmlDoc = AEXMLDocument(xmlData: responseData, error: &error)
    
        respCode=xmlDoc.root["soap:Body"]["\(methodName)Response"]["\(methodName)Result"]["_jResponseCode"].value!.toInt()!
        var dictData:AEXMLElement = xmlDoc.root["soap:Body"]["\(methodName)Response"]["\(methodName)Result"]["_objResponse"]["_structConcertDetails"]
        ConcertDetails.sConcertName = dictData["sConcertName"].value!
        ConcertDetails.sConcertOrganiserName = dictData["sConcertOrganiserName"].value!
        ConcertDetails.sConcertVenue = dictData["sConcertVenue"].value!
        ConcertDetails.sPlaylistCreatedBy = dictData["sPlaylistCreatedBy"].value!
        ConcertDetails.sPlaylistName = dictData["sPlaylistName"].value!
        var songList:AEXMLElement = dictData["aStructSongDetails"]
        for var i:Int = 0; i < songList.children.count; i++
        
            var songXML:AEXMLElement = songList.children[i]
            var structSong:structSongDetails = structSongDetails()
            structSong.sSongsName = songXML["sSongsName"].value!
            structSong.suidSong = songXML["suidSong"].value!
            structSong.sSongArtist = songXML["sSongArtist"].value!
            ConcertDetails.SongList.append(structSong)
        
        pageTarget?.serviceResponse(self)
    

我在这里称呼它:

override func viewDidLoad() 
    super.viewDidLoad()
    navHeight = self.navigationController?.navigationBar.frame.height
    statusHeight = UIApplication.sharedApplication().statusBarFrame.height
    addSongRequestTimerLabel()
    soapObject = GetConcertDetails()
    soapObject.request(["B54f22899a5712b3efb2ec191101b2f917"])
    soapObject.pageTarget = self
    var connector: WSSoapConnector = WSSoapConnector()
    connector.callAPI(soapObject)

这是自定义 API:

protocol _IFaceAPI

    var methodName: String get
    var pageTarget: _IFaceCallTarget? get set
    var soapEnv: String get set
    var respCode: Int get set
    func request(params:[String])
    func response(response responseData: NSMutableData)

我正在重新加载服务响应中的 tableView,如下所示:

func serviceResponse(target: _IFaceAPI)

    self.tableView.reloadData()

reloadData 不起作用。我收到了 songList 数组中所有 200 首歌曲的正确响应。但是当我运行应用程序时,桌子上什么也没有显示。无论是在模拟器中还是在我的 iPhone 6 上

更新tableview的代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

    let cell = tableView.dequeueReusableCellWithIdentifier("songListItem") as! UITableViewCell
    if self.soapObject.ConcertDetails.SongList[indexPath.row].checkValue == 1
    
        cell.accessoryType = .Checkmark
        cell.backgroundColor = UIColor.lightGrayColor()
        cell.userInteractionEnabled = false
    
    else
    
        cell.accessoryType = .None
    
    cell.textLabel?.text = self.soapObject.ConcertDetails.SongList[indexPath.row].sSongsName + "-" + self.soapObject.ConcertDetails.SongList[indexPath.row].sSongArtist
    // Configure the cell...

    return cell

【问题讨论】:

【参考方案1】:

UI 只能从主线程更新:

dispatch_async(dispatch_get_main_queue()) 
    self.tableView.reloadData()

否则不阻塞

self.tableView.reloadData()

【讨论】:

谢谢,但服务响应在主线程上。当我在 UIViewController 上使用 tableView 时,相同的方法有效。但是当我直接使用 UITableViewController 时它不起作用。

以上是关于从 UITableViewController 重新加载 tableView的主要内容,如果未能解决你的问题,请参考以下文章

从 UITableViewController 添加标记到 UIViewController

从 UITableViewController 重新加载 tableView

从 UITableViewController 加载通用视图

从 firebase 获取数据到 UITableViewController - swift

如何从 UiTableViewController 访问自定义 UITableViewCell 的属性?

Xcode:将信息从 UITableViewController 传递到 UIViewController