【问题标题】:Reloading NSTableView after downloading data下载数据后重新加载 NSTableView
【发布时间】:2016-01-11 01:25:00
【问题描述】:

我正在编写一个应用程序来帮助我在解析时更新我的​​数据库,并且我正在尝试将对象加载到 nstableview 中。

无论出于何种原因,我在视图控制器中进行调用时返回 nil,因此我将数据移动到我的 appdelegate 以获取对象。

let storyBoard = NSStoryboard(name: "Main", bundle: nil)
let myVC = storyBoard.instantiateControllerWithIdentifier("teacher") as! ViewController

var teachers = [Teacher]()

let query = PFQuery(className: "TeacherList")
query.findObjectsInBackgroundWithBlock {
    objects, error in
    if let objects = objects {
        for object in objects {
            let teacher = Teacher()
            teacher.name = object["name"] as! String
            teacher.email = object["email"] as! String
            teacher.subjectsTaught = object["subjectsTaught"] as! [String: String]
            teacher.category = object["category"] as! String
            teacher.uniqueID = object.objectId!
            teachers.append(teacher)
        }

    }
    print(teachers)
    myVC.teacherList = teachers
}

如您所见,我将其传递给了我的 VC。所以我知道我需要重新加载数据,因为 viewDidLoad() 将在数据下载之前被调用。我已经尝试将 tableView.reloadData() 放入教师列表的 didSet 中,以防万一在视图加载之前设置,我什至将它放入 viewdidload。

var teacherList: [Teacher]? {
didSet {
    print("got set")
    tableView.reloadData()
  }
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.setDelegate(self)
    tableView.setDataSource(self)
    tableView.reloadData()
}

但是,无论如何,对于 viewdidload 之后发生的任何事情,我的 tableview 都是 nil。我还在我的 getSet 中尝试了可选的 channing。 我还应该说我是 OSX 编程的新手,因为我已经完成了大部分 iOS 编程。

我可以将查询放在我的 VC 中,但是每当我运行查询时,我都会返回 nil。

【问题讨论】:

    标签: swift macos nstableview


    【解决方案1】:

    PFQuery 异步工作,数据返回的时间要晚得多——就计算机速度而言——在viewDidLoad 退出之后。

    在主线程上填充数组后立即在块中重新加载表视图。

    var teachers = [Teacher]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.setDelegate(self)
        tableView.setDataSource(self)
        let query = PFQuery(className: "TeacherList")
        query.findObjectsInBackgroundWithBlock { [unowned self] (objects, error) in
          if let objects = objects {
            for object in objects {
                let teacher = Teacher()
                teacher.name = object["name"] as! String
                teacher.email = object["email"] as! String
                teacher.subjectsTaught = object["subjectsTaught"] as! [String: String]
                teacher.category = object["category"] as! String
                teacher.uniqueID = object.objectId!
                self.teachers.append(teacher)
            }
          }
        dispatch_async(dispatch_get_main_queue()) {
          self.tableView.reloadData()
        }
        print(self.teachers)
      }
    }
    

    【讨论】:

    • 我想知道是否需要将 UI 重新加载回主队列,但是,我对下载对象的调用仍然返回 nil。我没有从解析中得到任何对象。现在,这对我来说似乎是一个错误,但是当我将完全相同的代码块放入我的 appdelegate 时,我的对象又回来了。
    • 是的,你必须这样做,因为后台任务通常在单独的线程上工作。
    • 基本上该代码应该可以工作。是否有特定的理由以编程方式而不是在 Interface Builder 中实例化主控制器?也许这是一个时间问题。添加打印行以查看何时调用 viewDidLoad。
    • 我这样做的唯一原因是因为我无法在 VC 中下载解析对象,所以我会在 appdelegate 中尝试它,然后将其传递。当查询返回 appdelegate 中的对象时,我得到了一个很好的数据字典,但是当我在 VC 的 viewdidload 中运行完全相同的查询时,我返回 nil。我一辈子都想不通为什么会有不同。
    • 好的,找到答案,只需要弄清楚如何解决它。 link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多