xcode - TableView 未更新

标签 xcode swift calendar tableview

我目前正在努力让我的 TableView 在完成 viewDidLoad 和 viewDidAppear 中调用的一些函数后更新。我尝试在 viewDidLoad 末尾使用 self.tableView.reloadData() 但它不起作用,并且在重新加载选项卡时,应用程序会崩溃。

这是我的一些代码(我正在尝试从 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
}

}

我将不胜感激任何帮助和见解:-)非常感谢!

最佳答案

在output.text = eventString之后,您应该重新加载tableview。

关于xcode - TableView 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37889659/

相关文章:

ios - 如何在 xCode AutoLayout 中撤消编辑最终值,以便再次优先使用基本值?

ios - XCODE 8.2 错误地检测到锁定的设备

swift - 在整数前包含零

swift - 用户不允许定位时如何处理

swift - 具有通用委托(delegate)的通用类。如何区分哪个对象的委托(delegate)正在执行回调?

java - 日历 getTime() 只返回 EST

Android 日历 DTSTART 和 DTEND 问题

ios - 如何为 MapView 上的每个自定义注释添加图像?

ios - 用于开发配置文件的通配符应用程序 ID/"No Code Signing Identity Found"

Java API 用于获取一年中特定时区夏令时的开始和结束详细信息