2016-06-08 58 views
1

我是新来的编码和swift。我正在尝试制作一个简单的预约应用程序来帮助我的医疗计划。这是我第一次尝试堆栈溢出问题:s,我在Swift中编写代码。我设法让应用程序访问Event商店,并且能够将所有日历中的所有事件打印到控制台中,但无法将事件显示在我的表格中。我试图找到其他人是否有这个问题在这里,但我仍然无法找到一个解决方案,在我的项目中工作。对不起,如果这已被问到其他地方。EKEvents不在swift中填充tableview

我已经在下面添加了我的代码。我检查了我的所有ViewController连接,并确保TableViewCell具有标识符“cell”以及检查连接的委托和数据源连接。

在函数tableView,numberOfRowsInSection中,当我将它打印到控制台时,返回self.events.count返回0。另外我的cellForRowAtIndexPath似乎没有被调用......这是为什么表中没有显示任何东西?我是一个完整的新秀,所以我希望有一些这是有道理的,我可以完全脱离球...

我真的很感谢任何帮助和指导!谢谢!

class AppointViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var eventStore: EKEventStore! 
var events = [EKEvent]() 
var startDate = NSDate() 
var endDate = NSDate() 
var cellIdentifier = "cell" 

@IBOutlet var tableView: UITableView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.automaticallyAdjustsScrollViewInsets = false 

    isAppAlreadyLaunchedOnce() 

    self.tableView.dataSource = self 
    self.tableView.delegate = self 

    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier); 
    self.tableView.reloadData(); 

} 

override func viewWillAppear(animated: Bool) { 
    // Fetch all events 
    // Connect to the Event Store 
    self.eventStore = EKEventStore() 
    self.events = [EKEvent]() 
    self.eventStore.requestAccessToEntityType(EKEntityType.Event) { (granted: Bool, error: NSError?) -> Void in 

     if granted { 

      print("Access Granted") 

      let fourYearsAgo = NSDate(timeIntervalSinceNow: -1 * 60 * 60 * 24 * 365 * 2) 
      let predicate = self.eventStore.predicateForEventsWithStartDate(fourYearsAgo, endDate: self.endDate, calendars: nil) 
      let events = NSMutableArray(array: self.eventStore.eventsMatchingPredicate(predicate)) 

      //TEST TO MAKE SURE EVENTS ARE BEING EXTRACTED 
      print(events, "printing events") 

      dispatch_async(dispatch_get_main_queue()) { 
       dispatch_async(dispatch_get_global_queue(0, 0)) { 
        self.eventStore.enumerateEventsMatchingPredicate(predicate) { 
         (events:EKEvent, stop:UnsafeMutablePointer<ObjCBool>) in 
         if events.title.rangeOfString("events") != nil { 
          print("String not nil") 
          stop .memory = true 
         } 
        } 
       } 
      } 
     } else { 
      print("The app is not permitted to access events") 
     } 
    } 
} 


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


//MARK: UITableViewDataSource 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    //TEST PRINT EVENT COUNT 
    print("event count (print) \(events.count)") 

    return events.count 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cellIdentifier = "cell" 
    let cell:UITableViewCell! = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) 
    let events:EKEvent! = self.events[indexPath.row] 
    cell.textLabel!.text = events.title 
    cell.detailTextLabel!.text = events.startDate.description 
    print("event cell returned") 
    return cell 
} 
} 

回答

0

你没有打电话给:

self.events = events 
self.tableView.reloadData() 

后,你从商店得到的事件。你应该在主队列中调用它。

+0

感谢@srvv为您的回应,我收到一个错误(无法指定值键入'NSMutableArray'键入'[EKEvent]')如果我这样做。我把它叫在错误的地方吗?谢谢。 – Jnc

+0

尝试'self.events = events as! [EKEvent]' 或者你可以直接指定 'self.events = self.eventStore.eventsMatchingPredicate(predicate)' – srvv

+0

尽管'NSMutableArray'是'NSArray'的子类,swift在将它转换为swift时会产生警告它总是会失败。 要解决您可以使用'self.events = events.copy()as! [EKEvent]' – srvv