删除 tableview 单元格并刷新视图控制器后刷新 tableview

Posted

技术标签:

【中文标题】删除 tableview 单元格并刷新视图控制器后刷新 tableview【英文标题】:Refresh tableview after delete a tableview cell and refresh view controller 【发布时间】:2016-11-21 01:08:01 【问题描述】:

顺便说一句,我需要快速回答。基本上,我有两个问题要提神。如果您认为代码太长而无法查看,这就是我想要做的。一种是在单击 tableview 单元格之一上的删除按钮后刷新 tableview。我试过 refreshcontrol,它没有用,也不是我想要的,但拥有它们会很酷。我的另一个问题是,如何通过单击按钮来刷新视图控制器。这是代码。

删除按钮在我的自定义单元格类中 类 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)


我想在另一个类中重新加载数据的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
        
    


我认为我的第二个问题不需要代码,我只是想知道如何刷新视图控制器。我试图关闭当前控制器并重新打开它,但它显然不起作用。

如果你们能帮助任何问题,我将不胜感激!

谢谢!

【问题讨论】:

【参考方案1】:

嗯,首先,如果你想刷新tableview数据你必须通知它,这样它就知道模型是否有任何变化。 如果你想重新加载整个表格视图(我强烈建议不要这样做) 你可以使用

 tableView.reloadData()

如果要刷新某些行,请使用以下方法:

tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.None) 

或者您可以仅将此方法用于删除操作。观察点击按钮事件并向 tableView 发送信号以删除该行。当tableView接收到这个信号时,只需通过执行以下方法即可。

 tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)

强制重绘您的自定义视图:view.setNeedsDisplay()

【讨论】:

问题是我的删除按钮操作在我的自定义单元格中,我如何能够在该操作中引用表格视图?表格视图未在自定义单元格中定义 我建议你熟悉以下一些:en.wikipedia.org/wiki/Observer_pattern,NSNotificationCenter,KeyValue 观察或 ReactivePrograming (Reactive Kit) github.com/ReactiveKit/ReactiveKit 那么您的意思是当我单击自定义单元格中的删除按钮以通知主题是包含自定义单元格的表格视图时,我会向通知中心发送信号吗?你介意分享通知代码吗?谢谢 是的,当然没问题。我个人为此使用反应式编程和绑定,但这对您来说可能有点麻烦。现在首先在动作处理程序上发布这样的通知:NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)。然后在 viewDidLoad 上观察它: NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.methodhandlingTheNotificationEvent(_:)), name:"NotificationIdentifier", object: nil) 并实现你的 "methodhandlingTheNotificationEvent()" 只是想确保当您说 viewDidLoad 时,您的意思是包含 tableview 的类中的 viewDidLoad,而不是自定义单元格类,对吗?而“methodhandlingTheNotificationEvent()”是我在包含tableview的类中写对应通知的方法名吧?【参考方案2】:

重新加载tableview数据

[_tableView reloadData];

【讨论】:

当我点击刷新按钮时我试过了,但什么也没做

以上是关于删除 tableview 单元格并刷新视图控制器后刷新 tableview的主要内容,如果未能解决你的问题,请参考以下文章

原型单元 - 第一个没有内容视图的单元

如何在单元格 Swift 2 中删除项目后重新加载表格视图

删除单元格后刷新tableView

如何在swift中删除行后刷新tableview?

目标 C:如何突出显示 tableView 单元格并在重新加载表格时保持突出显示?

删除firebase中的数据后如何刷新TableViewCell?