2016-06-08 60 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