2016-06-17 17 views
0

の後に私のTableViewを更新するのが現在苦労しています。 viewDidLoadとviewDidAppearで呼び出されたいくつかの関数の実行が終了しました。私は自分のviewDidLoadの最後にself.tableView.reloadData()を使ってみましたが、うまくいかず、タブを再読み込みするとアプリケーションがクラッシュしてしまいました。TableViewが更新されていない

私のコードの一部です(私はGoogleカレンダーからイベントを取得して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の後、テーブルビューをリロードする必要があります。そのことが分かれば教えてください。 – brl214

+0

私はそれをテキストに変更して申し訳ありません。残念ながら、output.text = eventStringの後に置くと、私のためのトリックはありませんでした。起動時にクラッシュする原因になりました:-( – Tim

+1

あなたはあなたのclienIDを削除する必要があります。空白で表示されますか? – brl214

答えて

0

output.text = eventStringの後に、tableviewをリロードする必要があります。

関連する問題