reloadData() 不能快速工作

Posted

技术标签:

【中文标题】reloadData() 不能快速工作【英文标题】:reloadData() isn't work in swift 【发布时间】:2016-03-15 17:51:58 【问题描述】:

所以,我遇到了麻烦 - 无法重新加载 TableView 的数据,在命令行中我看到了好的数据 - 当我单击按钮时 idMeet 已更改,但在模拟器中单击按钮后我看不到刷新表视图,并且idMeet 已更改,我的查询也已更改。我知道我必须使用tableView.reloadData(),但不明白在哪里写才能正确工作?

    var x = true;

        @IBOutlet weak var myButton: UIButton!
        @IBOutlet var tbRouteData: UITableView!
        @IBAction func act(sender: UIButton) 
            x = !x
            getInfo()
        

        override func viewDidLoad() 
            super.viewDidLoad()
        

        override func viewWillAppear(animated: Bool) 
            self.getTmp()
        

        func getInfo() -> NSMutableArray 
            sharedInstance.database!.open()
         var idMeet: Int
         if x 
                idMeet = 1
             else 
                idMeet = 2
            

            print(idroute)

            let selectInfo: FMResultSet! = sharedInstance.database!.executeQuery("SELECT * FROM t1 AS one JOIN t2 AS two ON (one.id = two.id AND two.line_id = ?) ORDER BY two.position ASC", withArgumentsInArray: [idMeet])
    ...
            return tmp
        

    func getTmp()

        infoTmp = NSMutableArray()
        infoTmp = getInfo()
    


    // MARK: - Table view data source

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        return infoTmp.count
    

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

        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! PrivateCell

        let my:Info = infoTmp.objectAtIndex(indexPath.row) as! Info
        cell.listOfStop.text = my.Name.uppercaseString
        return cell
    

【问题讨论】:

您的代码中没有重新加载 我问必须在哪里重新加载 【参考方案1】:

这里有几个问题:

    getTmp 函数应该重新加载数据:

    func getTmp()
        infoTmp = getInfo()
        tbRouteData.reloadData()
    
    

    现在您有了一个填充属性并重新加载表的函数,act 应该调用它,而不是 getInfo

    @IBAction func act(sender: UIButton) 
        x = !x
        getTmp()
    
    

    当您调用getInfo 时,不会设置infoTmp。并通过调用 getTmp 来集中 infoTmp 的人口并将表格重新加载到一个地方。

    如果您在表格视图中没有看到任何数据,请确保您已相应地设置表格视图的delegate。您可以在 IB 中或以编程方式执行此操作:

    override func viewDidLoad() 
        super.viewDidLoad()
        tbRouteData.delegate = self
    
    

    当然,这假设您将视图控制器定义为符合UITableViewDataSource 并实现了适当的方法。如果没有看到这些方法,我们无法判断那里是否还有其他问题。

【讨论】:

【参考方案2】:
func getTmp()

        infoTmp = NSMutableArray()
        infoTmp = getInfo()
        tbRouteData.reloadData()
    

编写此代码,这将在数组填满后使用新数据重新加载您的 tableview

【讨论】:

谢谢,但它不起作用,tableView 没有重新加载。在模拟器中,我看到 idMeet = 1 时的信息,但 idMeet = 2(它在命令行中看到) 您是否曾经在 tableVIew 中看到过数据?您是否链接了数据源和数据委托?是否调用了 tableView 方法? 不,我没有在 tableView 中看到新数据。我看到点击按钮后“idMeet”发生了变化,但tableView中的数据没有变化。是的,数据源和数据委托已链接。【参考方案3】:

重新加载数据应该在按钮内完成,但在 getInfo() 完成之后。以下应该有效:

    @IBAction func act(sender: UIButton) 
        x = !x
        getInfo()
        tbRouteData.reloadData()
    

【讨论】:

谢谢,但它不起作用,tableView 没有重新加载。在模拟器中,我看到 idMeet = 1 时的信息,但 idMeet = 2(它在命令行中看到) 您是否能够打印新数据以确保其正确填充?可能是刷新正确但数据没有变化 所以,点击后我从数据库的命令行中获取新数据,我将搜索我的新数据不想重新加载的位置。这是第一次,因为在下一个VC中我没有那么问题.. 我看到 func tableView 得到了很好的新数据,因为当 print(my.Name) 我看到来自 DB 的新数据,但在模拟器中我看到旧数据(无需重新加载) 不看应用很难说是什么问题。确保你尝试运行其他函数底部的 reloadData 函数,看看它是否有任何效果【参考方案4】:

通常当 tableView 数据数组改变时 tableView 应该重新加载。在这种情况下,在按钮操作方法的末尾重新加载 tableview。

@IBAction func act(sender: UIButton) 
        x = !x
        getInfo()
        tbRouteData.reloadData()

【讨论】:

不工作,tableView 没有重新加载。在模拟器中,我看到 idMeet = 1 时的信息,但 idMeet = 2(它在命令行中看到)

以上是关于reloadData() 不能快速工作的主要内容,如果未能解决你的问题,请参考以下文章

iOS:tableView.reloadData() 不能快速工作

为啥UITableView不能reloadData

为啥重新加载 tableView 不能快速工作?

深入reloadData

reload方法

iOS UITableView reloadData 仅在我第二次调用我的 reload 函数时刷新表