使用通知中心和 tableview.reloaddata() 不刷新表视图

Posted

技术标签:

【中文标题】使用通知中心和 tableview.reloaddata() 不刷新表视图【英文标题】:tableview not refreshing by using notificationcentre and tableview.reloaddata() 【发布时间】:2016-07-19 12:34:13 【问题描述】:

这是我使用通知中心和 tableview.reloaddata() 单击自定义 tableview 单元格上的删除按钮时用来刷新 tableview 的代码。我搜索了一堆其他代码,我认为我的代码看起来不错。我不知道为什么它只是不刷新。

这是我的tableview所在的地方

override func viewDidLoad() 
    super.viewDidLoad()
    username = tempUser.username
    self.resultSearchController = (
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        controller.searchBar.sizeToFit()
        self.tableView.tableHeaderView = controller.searchBar

        return controller

    )()
    get(value) in
        self.values = value
        for ele in self.values
            if self.username != ele["username"] as! String
            
        
    
    self.tableView.reloadData()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(serviceBoard.methodhandlingTheNotificationEvent), name:"NotificationIdentifie‌​r", object: nil)



func methodhandlingTheNotificationEvent()
    tableView.reloadData()

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if (self.resultSearchController.active && resultSearchController.searchBar.text != "") 
        return self.filteredTableData.count
    
    else 
        return values.count
    

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as!postCell
    let maindata = values[values.count-1-indexPath.row]

    if (self.resultSearchController.active && resultSearchController.searchBar.text != "") 


        //            if (filteredTableData[indexPath.row].rangeOfString("###") == nil)
        cell.postImg.image = UIImage(named:"tile_services")
        cell.title.text = filteredTableData[indexPath.row]
        cell.category.text = "SERVICES"
        var price = String()
        for i in values
            if (i["title"] as? String)! == filteredTableData[indexPath.row]
                price = (i["price"] as? String)!
                cell.categories = "Services"
                cell.username = i["username"] as! String
                cell.prices = i["price"] as! String
                cell.notes = i["notes"] as! String
                cell.school = i["school"] as! String
            
        
        cell.price.text = price 

        return cell
    
    else 
        if maindata["username"] as! String != username && username != "admin"
            cell.deleteBtn.hidden = true
        
        else
            cell.categories = "Services"
            cell.username = maindata["username"] as! String
            cell.prices = maindata["price"] as! String
            cell.notes = maindata["notes"] as! String
            cell.school = maindata["school"] as! String
        

        cell.postImg.image = UIImage(named:"tile_services")
        cell.title.text = maindata["title"] as? String
        cell.category.text = "SERVICES"
        cell.price.text = maindata["price"] as? String

        return cell
    

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("showPostT") as! showPostT
    self.addChildViewController(popOverVC)
    popOverVC.view.frame = self.view.frame
    self.view.addSubview(popOverVC.view)
    popOverVC.didMoveToParentViewController(self)
    if (self.resultSearchController.active && resultSearchController.searchBar.text != "") 
        for i in values
            if (i["title"] as? String)! == filteredTableData[indexPath.row]
                popOverVC.type.text = "SERVICE"
                popOverVC.typeImg.image = UIImage(named:"tile_services")
                popOverVC.item.text = "Service: \(i["title"] as! String)"
                popOverVC.price.text = "Price: \(i["price"] as! String)"
                popOverVC.notes.text = "Notes: \(i["notes"] as! String)"
                popOverVC.comments.text = i["comments"] as? String
                popOverVC.postUser.text = i["username"] as! String
                popOverVC.notesStr = i["notes"] as! String
                popOverVC.category = "service"
                popOverVC.pricesStr = i["price"] as! String
                if username == popOverVC.postUser.text!
                    popOverVC.composeBtn.hidden = true
                
            
        
    
    else
        let maindata = values[values.count-1-indexPath.row]
        popOverVC.type.text = "SERVICE"
        popOverVC.typeImg.image = UIImage(named:"tile_services")
        popOverVC.item.text = "Service: \(maindata["title"] as! String)"
        popOverVC.price.text = "Price: \(maindata["price"] as! String)"
        popOverVC.notes.text = "Notes: \(maindata["notes"] as! String)"
        popOverVC.comments.text = maindata["comments"] as? String
        popOverVC.postUser.text = maindata["username"] as! String
        popOverVC.notesStr = maindata["notes"] as! String
        popOverVC.category = "service"
        popOverVC.pricesStr = maindata["price"] as! String

        if username == popOverVC.postUser.text!
            popOverVC.composeBtn.hidden = true
        
    


这是我的自定义表格视图单元格

class postCell: UITableViewCell

@IBOutlet weak var deleteBtn: UIButton!
@IBOutlet weak var postImg: UIImageView!
@IBOutlet weak var category: UILabel!
@IBOutlet weak var location: UILabel!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var price: UILabel!
var prices = String()
var notes = String()
var comments = String()
var locations = String()
var categories = String()
var school = String()
var username = String()
var date = String()


@IBAction func deleteAction(sender: AnyObject) 
    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.percyteng.com/orbit/deletePost.php")!)
    request.HTTPMethod = "POST"
    let postString = "name=\(username)&location=\(locations)&price=\(prices)&notes=\(notes)&school=\(school)&category=\(categories)"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
        data, response, error in

        if error != nil 
            print("error=\(error)")
            return
        

        print("response = \(response)")

        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("responseString = \(responseString)")
    
    task.resume();           NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifie‌​r", object: nil)




override func awakeFromNib() 
    super.awakeFromNib()

override func setSelected(selected: Bool, animated: Bool) 
    super.setSelected(selected, animated:animated)


【问题讨论】:

这个你试过了吗,self.tableview.performSelectorOnMainThread(#selector(UITableView.reloadData), withObject: nil, waitUntilDone: false) 我回家试试看! 【参考方案1】:

当您单击“删除”按钮时,您似乎没有更新 values 属性。

func methodhandlingTheNotificationEvent()
    // you have to update the `values` array so that it doesn't contain the value you've just removed.
    tableView.reloadData()

【讨论】:

那么我应该用这种方法再次从数据库中抓取数据吗?哈哈,我一直认为 tableview.reloadData() 会自动完成所有工作。而那些其他答案从未提到这一点!我会试试看! 您可以在发布通知时将您删除的对象发送到userInfo 中。但为此,您需要在单元格中为其提供参考。 我对你在这里所说的话感到困惑。你的意思是在我发布通知之后/当我发布通知时,我可以将整个单元格发送到包含 tablewview 的主类?我不能在 methodhandlingTheNotification() 中再次获取数据并重新加载 tableview 吗? 您绝对可以再次获取数据:) 以防万一您有大量数据,为了不重新加载它,您可以将已删除的对象与通知一起发送,然后将其从@中删除987654324@ 数组。两种解决方案都可以,只是性能问题。 听起来不错!我认为这就是我的 tableview.reloaddata() 不起作用的原因。这真的很有帮助。我现在无法访问我的代码。我稍后测试后会接受这个答案! :) 非常感谢【参考方案2】:

尝试在 viewDidAppear() 中重新加载表。

【讨论】:

【参考方案3】:

您必须在重新加载 tableview 之前更新您的数据源,然后只有您的 tableview 会受到影响,否则您将永远得到旧表。

我认为maindata 是您cellforrowAtIndexpath 中的主要数据源。所以你必须从你的数据源中更新或删除,然后你应该重新加载数据。

【讨论】:

听起来不错,所以我认为的解决方案是在 methodhandlingTheNotification() 中重新加载数据库中的数据,但听起来我需要在 cellforrowAtIndexPath 中做一些事情。我如何能够从 methodhandlingTheNotification() 引用该方法并更改 tableview,maindata 只是 cellforrowatindexpath 内的局部变量

以上是关于使用通知中心和 tableview.reloaddata() 不刷新表视图的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin和推送通知 - 使用Azure通知中心的原因?

Azure 通知中心和 Apple APNS 推送通知取消注册设备

通知中心和通知

Detox:如何使用 detox 在通知中心点击 iOS 推送通知

如何使用 UserNotifications 框架从通知中心删除远程通知

推送天蓝色通知中心的通知