2016-06-17 58 views
0

我目前正努力讓我的TableView更新我完成了一些在viewDidLoad和viewDidAppear中調用的函數。我嘗試使用self.tableView.reloadData()在我的viewDidLoad結束,但它沒有工作,並重新加載選項卡時,應用程序會崩潰。TableView不更新

這是我的一些代碼(我試圖從谷歌日曆中獲取事件並將其顯示在TableView中)。我試圖顯示一個名爲listOfEvents的字符串數組,它在之後被填充tableView已經被加載。

我也試過在我fetchEvents結束(添加self.tableView.reloadData()),但重裝後的標籤

class CalendarViewController: UITableViewController { 

var listOfEvents: [String] = [] 

private let kKeychainItemName = "Google Calendar API" 
private let kClientID = "clientID" 

// If modifying these scopes, delete your previously saved credentials by 
// resetting the iOS simulator or uninstall the app. 
private let scopes = [kGTLAuthScopeCalendarReadonly] 

private let service = GTLServiceCalendar() 
let output = UITextView() 

// When the view loads, create necessary subviews 
// and initialize the Google Calendar API service 
override func viewDidLoad() { 
    super.viewDidLoad() 

    if let auth = GTMOAuth2ViewControllerTouch.authForGoogleFromKeychainForName(
     kKeychainItemName, 
     clientID: kClientID, 
     clientSecret: nil) { 
      service.authorizer = auth 
    } 
} 

// When the view appears, ensure that the Google Calendar API service is authorized 
// and perform API calls 
override func viewDidAppear(animated: Bool) { 
    if let authorizer = service.authorizer, 
     canAuth = authorizer.canAuthorize where canAuth { 
      fetchEvents() 
    } else { 
     presentViewController(
      createAuthController(), 
      animated: true, 
      completion: nil 
     ) 
    } 
} 

// Construct a query and get a list of upcoming events from the user calendar 
func fetchEvents() { 
    let query = GTLQueryCalendar.queryForEventsListWithCalendarId("primary") 
    query.maxResults = 10 
    query.timeMin = GTLDateTime(date: NSDate(), timeZone: NSTimeZone.localTimeZone()) 
    query.singleEvents = true 
    query.orderBy = kGTLCalendarOrderByStartTime 
    service.executeQuery(
     query, 
     delegate: self, 
     didFinishSelector: "displayResultWithTicket:finishedWithObject:error:" 
    ) 
} 

// Display the start dates and event summaries in the UITextView 
func displayResultWithTicket(
    ticket: GTLServiceTicket, 
    finishedWithObject response : GTLCalendarEvents, 
    error : NSError?) { 

     if let error = error { 
      showAlert("Error", message: error.localizedDescription) 
      return 
     } 

     var eventString = "" 

     if let events = response.items() where !events.isEmpty { 
      for event in events as! [GTLCalendarEvent] { 
       let start : GTLDateTime! = event.start.dateTime ?? event.start.date 
       let startString = NSDateFormatter.localizedStringFromDate(
        start.date, 
        dateStyle: .ShortStyle, 
        timeStyle: .ShortStyle 
       ) 
       eventString += "\(startString) - \(event.summary)\n" 

       // An array holding all my upcoming events 
       listOfEvents.append("\(startString) - \(event.summary)") 
       print(listOfEvents) 
      } 
     } else { 
      eventString = "No upcoming events found." 
     } 
     output.text = eventString 
     self.tableView.reloadData() 
} 


// Creates the auth controller for authorizing access to Google Calendar API 
private func createAuthController() -> GTMOAuth2ViewControllerTouch { 
    let scopeString = scopes.joinWithSeparator(" ") 
    return GTMOAuth2ViewControllerTouch(
     scope: scopeString, 
     clientID: kClientID, 
     clientSecret: nil, 
     keychainItemName: kKeychainItemName, 
     delegate: self, 
     finishedSelector: "viewController:finishedWithAuth:error:" 
    ) 
} 

// Handle completion of the authorization process, and update the Google Calendar API 
// with the new credentials. 
func viewController(vc : UIViewController, 
    finishedWithAuth authResult : GTMOAuth2Authentication, error : NSError?) { 

     if let error = error { 
      service.authorizer = nil 
      showAlert("Authentication Error", message: error.localizedDescription) 
      return 
     } 

     service.authorizer = authResult 
     dismissViewControllerAnimated(true, completion: nil) 
} 

// Helper for showing an alert 
func showAlert(title : String, message: String) { 
    let alert = UIAlertController(
     title: title, 
     message: message, 
     preferredStyle: UIAlertControllerStyle.Alert 
    ) 
    let ok = UIAlertAction(
     title: "OK", 
     style: UIAlertActionStyle.Default, 
     handler: nil 
    ) 
    alert.addAction(ok) 
    presentViewController(alert, animated: true, completion: nil) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    print(self.listOfEvents.count) 
    return self.listOfEvents.count 
} 

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

    var event = "" 
    event = listOfEvents[indexPath.row] 

    cell.textLabel?.text = event 

    return cell 
} 

}

我希望得到任何幫助,還殺了我的應用程序和洞察力:-)非常感謝!

+0

你應該輸入你的代碼作爲文本,而不是圖像。在output.text = eventString之後,您應該重新加載tableview。讓我知道這是否有效。 – brl214

+0

抱歉,我將其更改爲文本。不幸的是,把它放在output.text = eventString之後並沒有對我造成詭計,並導致它在啓動時崩潰:-( – Tim

+1

你應該刪除你的clienID。不要讓其他人使用它。如果你不重新加載tableview?它顯示空白嗎? – brl214

回答

0

在output.text = eventString之後,您應該重新加載tableview。