关闭块不会在第二次 swift3 上重新加载表

Posted

技术标签:

【中文标题】关闭块不会在第二次 swift3 上重新加载表【英文标题】:Closure block not reloading table on second time swift3 【发布时间】:2017-04-27 15:24:35 【问题描述】:

我有一个带有按钮和标签的表格。当我点击按钮时,它会突出显示。所以我有 5 行,每行带有按钮和标签,当我点击每个按钮时,它们都会突出显示。现在除了表格 I 之外的剩余视图当我点击它时有取消按钮我希望重新加载所有选定的行。我的代码在第一次执行时工作正常。就像我选择了所有 5 个按钮然后点击取消按钮所有行都被重新加载。但是当我在表中选择按钮时再次行并点击取消没有任何反应。调用正在我的关闭函数中进行,我可以看到打印的正确索引用于重新加载但没有任何反应。我的代码是这样的-:

Cell 自定义类-:

import UIKit

class TestingControllerCellTableViewCell: UITableViewCell 

    @IBOutlet weak var TableButton: UIButton!
    @IBOutlet weak var TableMenu: UILabel!
    var TableButtonCallBack : (()->())?
    override func awakeFromNib() 
        super.awakeFromNib()
        ButtonLayout()
        // Initialization code
    
    func ButtonLayout()
    
      TableButton.layer.cornerRadius = 12.5
      TableButton.layer.borderWidth = 1.0
      TableButton.layer.borderColor = UIColor.gray.cgColor
      self.selectionStyle = UITableViewCellSelectionStyle.none
    

    @IBAction func filterTableRadioButtonAction(_ sender: UIButton) 

        TableButtonCallBack?()
    


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

        // Configure the view for the selected state
    


控制器类-:

    import UIKit

    class filterControllerViewController: UIViewController 
         @IBOutlet weak var TableViewController: UITableView!
        fileprivate var ButtonSelectedIndex = [[Int]]()
        fileprivate var cancelDataItemSelectedCallBack : ((Int)->())? = nil
        override func viewDidLoad() 
            super.viewDidLoad()
            filterTableViewSetUp()
            // Do any additional setup after loading the view.
        

        // CANCEL ACTION
        @IBAction func cancelDataItemSelected(_ sender: UIButton) 
            for sectionIndex in 0..<filterRadioButtonSelectedIndex.count
            
                for valueIndex in 0..<ButtonSelectedIndex[sectionIndex].count
                
                  cancelDataItemSelectedCallBack!(ButtonSelectedIndex[sectionIndex][valueIndex])
                

            
            ButtonSelectedIndex.removeAll()
        



        func TableViewSetUp()
        
            TableViewController.delegate = self
            TableViewController.dataSource = self
            TableViewController.backgroundColor = UIColor.green
        
            override func didReceiveMemoryWarning() 
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        
        
    

    extension filterControllerViewController:UITableViewDataSource,UITableViewDelegate
    
         func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
         
           return data.count
         

         func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
         
            let filterCell = tableView.dequeueReusableCell(withIdentifier: "filterCell", for: indexPath) as! FilterControllerCellTableViewCell
            filterCell.filterTableRadioButtonCallBack = 
            filterCell.TableButton.backgroundColor = UIColor.blue
            self.ButtonSelectedIndex.append([indexPath.row])
            
    // THIS cancelDataItemSelectedCallBack CALLED FIRST TIME AND RELOAD TABLE EVEN GETS CALLED SECOND TIME SHOWS CORRECT INDEX BUT TABLE BUTTONS STLL REMAIN HIGHLIGHTED

         self.cancelDataItemSelectedCallBack =  data in
                let indexPath = IndexPath(item: data, section: indexPath.section)
          print(indexPath)
                self.TableViewController.reloadRows(at: [indexPath], with: UITableViewRowAnimation.none)
            
            return filterCell
         

         func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
         
          return 40.0
         

我知道我遗漏了一些东西,但没有得到它。请帮助

print indexPath inside self.cancelDataItemSelectedCallBack 给了我这个正确的输出。但它只能工作一次。

[0, 2]
[0, 3]

【问题讨论】:

【参考方案1】:

您必须像这样在主线程上重新加载 UI:

self.cancelDataItemSelectedCallBack =  data in

    OperationQueue.main.addOperation 
        let indexPath = IndexPath(item: data, section: indexPath.section)
        self.TableViewController.reloadRows(at: [indexPath], with: UITableViewRowAnimation.none)
    
 

【讨论】:

以上是关于关闭块不会在第二次 swift3 上重新加载表的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4:UITableViewCell 在初始加载时不会显示数据,但会在第二次加载时加载

进行第二次 Json 调用 Swift 3 后如何在 UITableview 中重新加载数据

REACT - defaultChecked 在第二次加载时不呈现检查属性

自定义 tableviewcell 上的 UISlider 和 UILabel 在第二次播放音频之前不会使用 avaudioplayer 更新

在使用ItemContainerGenerator进行自定义时,WPF ComboBox在第二次打开之前不会更新项目

是啥导致我的基本客户端/服务器套接字程序中的循环在第二次尝试时失败? [关闭]