【问题标题】:Populating UITableview using instance to fill array使用实例填充 UITableview 以填充数组
【发布时间】:2016-07-24 09:22:54
【问题描述】:

我已经搜索过,但没有找到任何人发布过这样的内容,但是如果是这样,请随时为我指明正确的方向!

所以使用 MVC,我在 UITableviewcontroller 中创建了一个实例

var brainLink = LessonBrain()

这是我的 viewDidLoad,它应该获取数据并填充数组“subjectNameOneDay”:

    let todoDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey("subjectDictionary") ?? [:]

  brainLink.parseQuery(self.setupData.integerForKey("pupilNumber"), dictName: "subjectDictionary")

    self.subjectNameOneDay = todoDictionary["TwoTuesday"]! as! NSArray

self.tableView.reloadData()

brainLink 实例调用方法 'parseQuery':

func parseQuery(numberToRetreive: Int, dictName:String) {
        var tempArray:[String] = []


        if self.daysOfTheWeek.contains("\(self.currentDayOfTheWeekForLabel)") {

            print(currentDayOfTheWeekForLabel)


            print("parse query for data number \(numberToRetreive) started")

            let query:PFQuery = PFQuery(className: self.setupData.valueForKey("organisationID") as! String)
            query.fromLocalDatastore()
            query.whereKey("PupilNumber", equalTo: "\(numberToRetreive)")
            query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in

                if (error == nil) {

                    print("Successfully retrieved 2 \(objects)")

                    for object in objects! {

                        var periodCounter = 1

                        while periodCounter <= 6 {

                            print(self.currentDayOfTheWeekForData)


                            tempArray.append(object.valueForKey("\(self.currentDayOfTheWeekForData)P\(periodCounter)") as! String)
                            print(tempArray)

                            periodCounter += 1

                        }

                        self.addItem(tempArray, weekDayPeriod: self.currentDayOfTheWeekForData, dictionaryName: dictName)

                    }
                }else {
                    print(error!.userInfo)
                }
            }
        }else{
            print("It's the weekend!")
        }
        print("query function returning temp array")

    }

这一切正常并填充数组但是我遇到的问题是,无论我尝试了什么或将self.tableView.reloadData() 放在哪里,它都不会在尝试重新加载之前“等待”获取数据桌子。

我可以把这段代码放在哪里/安排它以便它获取数据然后重新加载?

【问题讨论】:

  • 将 reloadData 添加到您的回调中,而不是视图加载。至此,新数据将被检索到。
  • 为我的无知道歉.....我如何将它添加到我的回调中?你的意思是从 parseQuery 函数返回 self.tableView.reloadData() 吗??
  • 是的,但是你需要一个引用地址,所以 _weak MyTableViewClass *MyClass = self.然后在解析查询函数 mylass.reloadData 中(在调用它的方法之前,你应该检查我的类没有被 nil'd 出来)。您需要确保在调用 my class.reloadData 之前也填充了 tableview 数据源。

标签: ios arrays swift uitableview instance-variables


【解决方案1】:

以上行:

query.findObjectsInBackgroundWithBlock { (objects, error) -&gt; Void in

启动一个完成处理程序。该块将在调用完成时运行,因此执行线程将继续执行,这就是为什么当您的 reloadData 调用运行时,它还没有将对象添加到您的数组中。

如果您将reloadData 调用作为此块中发生的最后一件事,您将更接近获得您想要的结果。

您还应该确保在进行 UI 调用时运行在主线程上。由于您的完成块可以在任何线程上执行,您可以这样做:

            dispatch_async(dispatch_get_main_queue(), {
               self.tableView.reloadData()
            })

【讨论】:

  • 感谢 Mathew.......将重新加载放在块的最后一行给了我一个错误......该方法在另一个不是 UITableViewController 子类的类中,所以不能加载。上面的代码应该放在哪里?
  • 您可以将上面的 reload 调用替换为对您的类的函数调用,您可以在表上调用 reload。
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多