Swift:如何使用导航控制器重新加载表格

Posted

技术标签:

【中文标题】Swift:如何使用导航控制器重新加载表格【英文标题】:Swift: how to reload a table with navigation controller 【发布时间】:2016-06-04 13:47:49 【问题描述】:

我是初学者,请友好解释,谢谢。

所以基本上每次我点击一个单元格然后再点击我如何才能再次完全重新加载表格。

我尝试在 viewDidAppear 和 viewWillAppear 中添加tableView.reloadData(),它没有工作并尝试添加parseQuery.findObjectsInBackgroundWithBlock

所以我要解释一下我到底想要做什么

解析时我有一个布尔值,基本上如果它是假的,我会显示假数据,如果它是真的,我什么都不显示,一旦我点击该单元格,我将布尔值更改为真,当我点击返回时,我想要它会重新加载表格,以便再次检查布尔值是真还是假。

更新

我已将获取移动到viewWillApear,结果更接近我想要的。现在,当我点击任何一个单元格时,最后一个单元格会被删除,这不是应该的样子。我点击的那个应该从列表中删除。

    第 1 项 第 2 项 第 3 项 第 4 项

当我在逻辑上点击第 1 项时,第 1 项应该被删除,因为在解析中,布尔值将设置为 false,一旦设置为 false,它就不应该显示,但是会发生第 4 项被删除并且当我重新启动应用程序时请参阅第 1 项已删除,其余部分按原样保留。

     class recentTableViewController: UITableViewController 

     var tdyName = [String]()
     var dataparse: NSMutableArray = NSMutableArray()

     override func viewWillAppear(animated: Bool) 
     super.viewWillAppear(animated)

      self.tdyName.removeAll()

      let parseQuery = PFQuery(className: "request")
         parseQuery.findObjectsInBackgroundWithBlock  (objects, error) -> Void in
             if let objects = objects 

            for object in objects 
                if object["reqRead"] as! Bool == false     
                print("reqs not read")

                    self.tdyName.append(object["reqName"] as! String)
                    self.dataparse.addObject(object)

                 else 

                 print("req read")
                
            

            self.tableView.reloadData()
        

    




override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.

    return 1


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.

    return tdyName.count 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let myCell = tableView.dequeueReusableCellWithIdentifier("recentCell", forIndexPath: indexPath) as! recentTableViewCell

    let backgroundQueue = NSOperationQueue()
    backgroundQueue.addOperationWithBlock()

        let cellDataParse: PFObject = self.dataparse.objectAtIndex(indexPath.row) as! PFObject

        NSOperationQueue.mainQueue().addOperationWithBlock()

            myCell.recentName.text = cellDataParse.objectForKey("reqName")! as? String

        

    
    return myCell


我确实在不同的视图中将其更改为 true,但是当我返回此视图时,我看不到任何更改,除非我返回主视图并返回此处,因此它将完全重新加载并且我看到更改。

【问题讨论】:

不确定我是否理解。如果您只更改 Parse 上的布尔值,则需要从 Parse 中读取它以了解新值。 viewDidLoad 有查询,但不会仅通过返回视图来调用。当您说viewWillAppear 不起作用时,您是从那里重新进行查询吗? @PhillipMills 我已经更新了代码并解释了更多,如果有帮助的话 您的更新谈到删除了错误的内容,但我没有看到任何处理选择要删除的内容的代码。 @PhillipMills 基本上有一个带有单元格的tableView,一旦你点击一个单元格,它就会带你到另一个viewController,其中有两个按钮可以接受和拒绝,一旦任何按钮都是点击布尔值变为 false 然后您将返回 tableView 并且 tableView 中的最后一项被删除 【参考方案1】:

一些想法让您开始:

后台线程

您有几个任务在后台运行(这可能是件好事),但是一旦您得到结果,您就需要更新主线程上的所有 UI 元素。有几种方法可以做到这一点,但类似:

dispatch_async(dispatch_get_main_queue()) 
  tableview.reloadData()

另外,在cellForRowAtIndexPath 中,您再次调用后台线程,因此代码继续(在线程运行时)并且您的cell 返回初始化,但recentName.txt 可能不是您所期望的。

表格视图

你需要有一个本地集合(通常是Array)来保存你想在tableView中显示的数据。目前,您正在返回 tdyName.count 的行数,因此通常您将从同一来源构建您的单元格:tdyName(同样:并非总是如此,但在大多数简单的情况下就是这种情况)。如果tdyName 可以是真值或假值,则需要将其保存在本地某处,以便您可以访问它(在检索/写入数据库之后)。您将 true/false 的结果存储在名为 dataparse 的单独 Array 中。虽然技术上不正确,但它很可能与 tdyName 不同步。

建议:考虑创建一个包含两个值的结构,然后您的数组包含这些结构,如下所示:

struct Tdy      //of course use a better name for this
   let name: String
   var readReqs = false

当您从数据库中读取数据时,您会创建一个 Tdy 实例并将其分配给数据数组,因此您的数据数组定义将如下所示。

var dataArray = [Tdy]()     

...然后将 numberOfRowsInSection 更改为

return dataArray.count

这仍将显示所有值。如果您只想显示虚假记录,则可以将它们过滤掉。像这样的:

return dataArray.filter()  $0.readReqs == false  

最后,您应该删除 cellForRowAtIndexPath 中的 parse 调用,并从 'dataArray[indexPath.row]' 中填充单元格中的标签,如下所示:

myCell.recentName.text = dataArray[indexPath.row]

这可能无法解决您在更改数据方面的所有问题,但在基础正确之前,您可能会大吃一惊。一旦你有正确的结构

提示:viewDidLoad 中调用的代码块应该真正移动到一个函数中,并从viewDidLoad 调用该函数。这不会立即改变功能,但更清晰,并且随着您的应用程序的增长,您将希望能够尽可能多地重用代码 - 提取此代码将允许从任何地方调用它(在范围内)。

这里有很多东西需要细细琢磨,所以如果您需要进一步的帮助,请告诉我。如果您对此有所了解,请重新发布您的代码,我们将进一步帮助您!

【讨论】:

这对未来很有帮助,非常感谢,但现在我面临一个不同的问题,我已经将代码更新为我正在尝试做的事情,请检查你是否知道任何方法周围或解决方案谢谢。 一个月过去了,我没有得到任何解决方案。我猜它们确实不同步,因为当我print 他们并在日志中检查它们时它是正确的,但显示我的东西是错误的,我不知道如何创建一个连接到数据库的Struct。如果您能帮助我,我将不胜感激。

以上是关于Swift:如何使用导航控制器重新加载表格的主要内容,如果未能解决你的问题,请参考以下文章

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

swift 表格导航控制器

UITableView 重新加载 - Xcode 5

如何从 Modal ViewController 重新加载父 UITableViewController 中的数据

Swift - 远程通知和导航控制器流程

使用 Swift2 从 AppDelegate 重新打开 iOS 应用程序到指定的导航控制器