2016-02-26 36 views
-2

我把這個getCloudKit函數從ViewController.swiftLay.swift,所以我可以保持在一個類的一切。刷新給出錯誤,「發現零,同時展開一個可選值」

var objects = [Lay]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged) 
    self.getCloudKit() 
} 

func handleRefresh(refreshControl: UIRefreshControl) { 

    self.objects.removeAll() 
    self.getCloudKit() 
} 

func getCloudKit() { 

    let now = NSDate() 
    let predicate = NSPredicate(format: "TimeDate > %@", now) 
    let sort = NSSortDescriptor(key: "TimeDate", ascending: true) 

    let container = CKContainer.defaultContainer() 
    let publicData = container.publicCloudDatabase 

    let query = CKQuery(recordType: 「lay」, predicate: predicate) 
    query.sortDescriptors = [sort] 
    publicData.performQuery(query, inZoneWithID: nil) { results, error in 
     if error == nil { 
      for lay in results! { 
       let newlay = Lay() 

       newLay.tColor = lay["tColor"] as! String 
       newLay.timeDate = lay["TimeDate"] as! AnyObject 
       newLay.matchup = lay["Matchup"] as! String 

       let applicationDict = ["tColor" : newLay.tColor, "Matchup" : newLay.matchup] 
       let transfer = WCSession.defaultSession().transferUserInfo(applicationDict) 

       self.objects.append(newLay) 
      } 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self.refreshControl!.endRefreshing() 
       self.tableView.reloadData() 
      }) 

     } else { 
      print(error) 
     } 
    } 

} 

問題是,當我將它(以及必要的相關的代碼):

  • 錯誤Lay.swiftTableViewController().refreshControl!.endRefreshing()「致命錯誤:意外發現零而展開的 可選值「
  • 需要放我的從代碼在我AppDelegate.swift,但不斷收到錯誤,當我嘗試

ViewController.swift

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged) 
    Lay().getCloudKit() 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return Lay().objects.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 

    let object = Lay().objects[indexPath.row]; 
    if let label = cell.textLabel{ 
     label.text = object.matchup 
    } 

    return cell 
} 

func handleRefresh(refreshControl: UIRefreshControl) { 
    Lay().objects.removeAll() 
    Lay().getCloudKit() 
} 

Lay.swift

var objects = [Lay]() 


func getCloudKit() { 

    let now = NSDate() 
    let predicate = NSPredicate(format: "TimeDate > %@", now) 
    let sort = NSSortDescriptor(key: "TimeDate", ascending: true) 

    let container = CKContainer.defaultContainer() 
    let publicData = container.publicCloudDatabase 

    let query = CKQuery(recordType: 「lay」, predicate: predicate) 
    query.sortDescriptors = [sort] 
    publicData.performQuery(query, inZoneWithID: nil) { results, error in 
     if error == nil { 
      for lay in results! { 
       let newlay = Lay() 

       newLay.tColor = lay["tColor"] as! String 
       newLay.timeDate = lay["TimeDate"] as! AnyObject 
       newLay.matchup = lay["Matchup"] as! String 

       let applicationDict = ["tColor" : newlay.tColor, "Matchup" : newlay.matchup] 
       let transfer = WCSession.defaultSession().transferUserInfo(applicationDict) 

       self.objects.append(newlay) 
      } 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       TableViewController().refreshControl!.endRefreshing() 
       TableViewController().tableView.reloadData() 
      }) 

     } else { 
      print(error) 
     } 
    } 

AppDelegate

private func setupWatchConnectivity() { 
    if WCSession.isSupported() { 
     let session = WCSession.defaultSession() 
     session.delegate = self 
     session.activateSession() 
    } 
} 


private func sendUpdatedDataToWatch(notification: NSNotification) { 
    if WCSession.isSupported() { 
     let session = WCSession.defaultSession() 
     if session.watchAppInstalled 
     { 
       let applicationDict = ["TColor" : Lay().tColor, "Matchup" : Lay().matchup] 
       let transfer = WCSession.defaultSession().transferUserInfo(applicationDict) 
       NSLog("Transfer AppDelegate: %@", transfer) 
       NSLog("Trans AppDelegate: %@", applicationDict) 

       session.transferCurrentComplicationUserInfo(applicationDict) 
     } 
    } 
} 
+0

你做的每一次'TableViewController()'或'萊()'它正在創建這些類的新實例,而不是訪問現有的情況下,其他對象使用。 – dan

+0

啊,所以我的整個事情都搞砸了,或者我需要做一些小的改變,比如做一個sharedInstance或者什麼? – SRMR

+0

你需要一個參考存到自己的表視圖控制器,可能通過使用一個IBOutlet。 – wjl

回答

3

您的代碼始終有ViewController()Lay()。這將創建這些對象的新實例。因此,雖然refreshControl在您的實際視圖控制器中不爲零,但在新創建的視圖控制器中將爲零。

通過分割出getCloudKit功能,你允許的視圖控制器只是管理的觀點,新的階級,只是管理雲套件。這很好,所以理想情況下,您的Cloud Kit控制器不應該瞭解視圖控制器的任何內容。因此,getCloudKit不應該調用reloadData。相反,你可以傳遞一個閉包到getCloudKit中,當查詢結束時被調用。

func getCloudKit(completion completionHandler: (([Lay]) -> Void)?) { 
     ... 
     publicData.performQuery(query, inZoneWithID: nil) { results, error in 
      if error == nil { 
       ... 
       if let completion = completionHandler { 
        completion(self.objects) 
       } 
      } else { 
       print(error) 
     } 
    } 

然後在視圖控制器:沿東西線

let layCloudKit = LayCloudKit() 
    layCloudKit.getCloudKit(completion: { (objects) -> Void in 
     dispatch_async(dispatch_get_main_queue(), { 
      self.objects = objects 
      self.refreshControl!.endRefreshing() 
      self.tableView.reloadData() 
     }) 
    }) 

請注意,我假設你會把萊雲套件控制器到一個單獨的文件雨燕作爲萊模型類不應該不需要了解Cloud Kit。如果你想要把它放在同一個文件中萊,那麼你應該標記爲FUNC或staticclass,因爲你不希望創建萊的虛擬實例只是調用getCloudKit。在這種情況下,你會使用Lay.getCloudKit(即指定萊類,而不是一個世俗實例)調用它。

+0

想給這個嘗試,我會讓你知道,非常感謝! – SRMR

+0

實現現在,但堅持我認爲必須是Xcode錯誤,因爲出現錯誤「使用未解析的標識符LayCloudKit'」,這沒有任何意義,它不會找到該文件。 (我已經看過所有這些步驟,看看我做錯了什麼,沒有什麼突出的http://stackoverflow.com/questions/26099111/swift-compiler-error-use-of-unresolved-identifier-name) – SRMR

+0

這不太可能是一個錯誤。你創建了一個名爲'LayCloudKit.swift'的新文件,裏面有'class LayCloudKit'? – Michael

相關問題