gpt4 book ai didi

ios - 从 EKEventStore 获取事件并在 Swift iOS8 的 tableView 中显示

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:09 24 4
gpt4 key购买 nike

我正在尝试创建一个小型应用程序,它将获取所有事件并将它们显示在 tableView 中。

我的具体问题是:

  1. 我的 fetchEvents() 方法是否正确实现?
  2. 我应该在哪里调用 fetchEvent() 方法以便在应用程序打开时显示列表(是否在 viewDidLoad 中?)并在添加后刷新它/编辑一个新事件?

谢谢!

这是我为 MasterViewController.swift 文件编写的代码:

import UIKit
import EventKitUI

class MasterViewController: UITableViewController , EKEventEditViewDelegate{

var objects = NSMutableArray()
let eventStore = EKEventStore()


override func awakeFromNib() {
super.awakeFromNib()
}

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view, typically from a nib.
self.navigationItem.leftBarButtonItem = self.editButtonItem()

let addButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "insertNewObject:")
self.navigationItem.rightBarButtonItem = addButton

//self.fetchEvents()
}

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

func insertNewObject(sender: AnyObject) {

let controller = EKEventEditViewController()

eventStore.requestAccessToEntityType(EKEntityType(), completion: {granted, error in })
controller.eventStore = eventStore

controller.editViewDelegate = self
self.presentModalViewController(controller, animated: true)


let indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}

func eventEditViewController(controller: EKEventEditViewController!, didCompleteWithAction action: EKEventEditViewAction) {
self.dismissModalViewControllerAnimated(true)
}

func fetchEvents() -> NSMutableArray {

eventStore.requestAccessToEntityType(EKEntityType(), completion: {granted, error in })

let endDate = NSDate(timeIntervalSinceNow: 604800*10); //This is 10 weeks in seconds
let predicate = self.eventStore.predicateForEventsWithStartDate(NSDate(), endDate: NSDate(), calendars: nil)

var events = NSMutableArray(array: self.eventStore.eventsMatchingPredicate(predicate))

return events

/*
var indexes = NSMutableIndexSet(index: 5)

indexes.addIndex(4)

objects.insertObjects(events, atIndexes: indexes) */

// Create the start date components



/* NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
oneDayAgoComponents.day = -1;

let oneDayAgo = currentCalendar.date dateByAddingComponents:oneDayAgoComponents*/

}

// #pragma mark - Segues

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
let indexPath = self.tableView.indexPathForSelectedRow()
let object = objects[indexPath.row] as NSDate
(segue.destinationViewController as DetailViewController).detailItem = object
}
}

// #pragma mark - Table View

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

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

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

let object = objects[indexPath.row] as NSDate
cell.textLabel.text = object.description
return cell
}

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
objects.removeObjectAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}
}

最佳答案

首先,您应该在 eventStore.requestAccessToEntityType 回调中的 fetchEvents 函数中完成其余工作:

func fetchEvents() -> NSMutableArray {
eventStore.requestAccessToEntityType(EKEntityType()) completion: {
granted, error in
... the rest of the code ...
})
}

当然现在它是异步的,你需要在回调中返回数据而不是返回它:

func fetchEvents(completed: (NSMutableArray) -> ()) {
eventStore.requestAccessToEntityType(EKEntityType()) completion: {
granted, error in
let endDate = NSDate(timeIntervalSinceNow: 604800*10); //This is 10 weeks in seconds
let predicate = self.eventStore.predicateForEventsWithStartDate(NSDate(), endDate: NSDate(), calendars: nil)
let events = NSMutableArray(array: self.eventStore.eventsMatchingPredicate(predicate))
completed(events)
})
}

但现在您遇到了另一个问题……您在闭包中使用了 self,从而捕获了一个引用,这可能导致“reference cycle”。在这种特殊情况下,我很确定这不会发生,因为 requestAccessToEntityType() 不会保留对您的闭包的引用(我很确定漂亮),但是当你在回调函数中使用 self 时,使用 [weak self] 是个好主意:

完成后,self 是可选的,因此您需要确保它不是 nil ...

func fetchEvents(completed: (NSMutableArray) -> ()) {
eventStore.requestAccessToEntityType(EKEntityType()) completion: { [weak self]
granted, error in
if let strongSelf = self {
let endDate = NSDate(timeIntervalSinceNow: 604800*10); //This is 10 weeks in seconds
let predicate = strongSelf.eventStore.predicateForEventsWithStartDate(NSDate(), endDate: NSDate(), calendars: nil)
let events = NSMutableArray(array: strongSelf.eventStore.eventsMatchingPredicate(predicate))
completed(events)
}
})
}

但仔细观察,我们从不使用 self 只是 self.eventStore,所以我们可以直接捕获对它的弱引用:

func fetchEvents(completed: (NSMutableArray) -> ()) {
eventStore.requestAccessToEntityType(EKEntityType()) completion: { [weak weakEventStore = self.eventStore]
granted, error in
if let eventStore = weakEventStore {
let endDate = NSDate(timeIntervalSinceNow: 604800*10); //This is 10 weeks in seconds
let predicate = eventStore.predicateForEventsWithStartDate(NSDate(), endDate: NSDate(), calendars: nil)
let events = NSMutableArray(array: eventStore.eventsMatchingPredicate(predicate))
completed(events)
}
})
}

最后,你真的应该检查错误而不是忽略它们,(granted 可能是错误的,这意味着用户没有给你访问权限,或者可能有错误(所以你需要检查 error 是否为 nil (if error {/* handle failure */})

PS - 我有working code which uses event kit on github您可能会觉得有用。

关于ios - 从 EKEventStore 获取事件并在 Swift iOS8 的 tableView 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24722597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com