shi*_*ila 3 tableview ios ekeventstore swift ios8
我正在尝试创建一个小应用程序,它将获取所有事件并将它们显示在tableView中.
我的具体问题是:
fetchEvents()方法是否正确实施?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.
}
}
}
Run Code Online (Sandbox Code Playgroud)
首先,您应该fetchEvents在回调中的函数中完成剩下的工作eventStore.requestAccessToEntityType:
func fetchEvents() -> NSMutableArray {
eventStore.requestAccessToEntityType(EKEntityType()) completion: {
granted, error in
... the rest of the code ...
})
}
Run Code Online (Sandbox Code Playgroud)
当然现在它是异步的,你需要在回调中返回数据而不是返回它:
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)
})
}
Run Code Online (Sandbox Code Playgroud)
但是现在你有另一个问题......你在闭包中使用self,从而捕获一个引用,这可能导致" 引用周期 ".在这种特殊情况下,我很确定不会发生这种情况,因为requestAccessToEntityType()不会保留对你的闭包的引用(我很确定),但是[weak self]在你self在回调函数中使用的时候使用它是个好主意:
一旦你完成了,自我是一个可选的,所以你需要确保它不是零...
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)
}
})
}
Run Code Online (Sandbox Code Playgroud)
但仔细看一点,我们从来不使用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)
}
})
}
Run Code Online (Sandbox Code Playgroud)
最后,你真的应该检查错误而不是忽略它们(granted可能是假的,意味着用户没有给你访问权限,或者可能有错误(所以你需要检查是否error为nil(if error { /* handle failure */ })
PS - 我有工作代码,它使用github上的事件工具包,你可能会发现它很有用.
| 归档时间: |
|
| 查看次数: |
4940 次 |
| 最近记录: |