2016-09-07 7 views
1

Я пытаюсь заполнить ежедневные события в таблице. Я установил связи. (datasource, delegate и tableview) Но значение события возвращается 0. Извините, если это было задано еще где. Мне нужна небольшая помощь.Заполнение событий в Tableview (Swift)

Вот мой код.

импорт UIKit импорт EventKit импорт EventKitUI

класс MainViewController: 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() 
    automaticallyAdjustsScrollViewInsets = false 


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

    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier); 
    //self.tableView.reloadData() 
    self.eventStore = EKEventStore() 

    fetchEvents { (arr:[EKEvent]) in 
     print(arr) 
     self.events = arr 
     //reload table 
    } 
    self.tableView.reloadData() 
} 

func fetchEvents(completed: ([EKEvent]) ->()) { 
    eventStore!.requestAccessToEntityType(EKEntityType.Event, completion: { 
     granted, error in 
     let startDt = NSDate(timeIntervalSinceNow: -24 * 60 * 60); 
     let predicate = self.eventStore!.predicateForEventsWithStartDate(startDt, endDate: NSDate(), calendars: nil) 
     let events = self.eventStore!.eventsMatchingPredicate(predicate) 
     completed(events) 
    }) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

@IBAction func onLoadListButtonClicked(sender: AnyObject) 
{ 
    self.performSegueWithIdentifier("LoadTheList", sender: nil) 
} 



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 
} 

}

ответ

1

Issue ваша дата начала NSDate(timeIntervalSinceNow: 24 * 60 * 60) что один день вперед и дата окончания - текущая дата; Короче говоря, вы проверяете запуск событий завтра и заканчиваете сегодня;)

Просто используйте следующий метод, чтобы начать события вчера и закончится сегодня. Для дальнейшего использования просто измените startDt на любую предыдущую дату.

func fetchEvents(completed: (NSMutableArray) ->()) { 

    eventStore!.requestAccessToEntityType(EKEntityType.Event, completion: { 
     granted, error in 
     let startDt = NSDate(timeIntervalSinceNow: -24 * 60 * 60); 
     let predicate = self.eventStore!.predicateForEventsWithStartDate(startDt, endDate: NSDate(), calendars: nil) 
     let events = NSMutableArray(array: self.eventStore!.eventsMatchingPredicate(predicate)) 
     completed(events) 
    }) 
} 

Редактировать

Зов это как:

fetchEvents { (arr:NSMutableArray) in 
      print(arr) 
      //reload your table 
     } 
+0

спасибо! Можете ли вы сказать, где я должен использовать эту функцию? in to viewdidload? Извините, я новичок в быстром. – sashatheitguy

+0

Да, вы можете использовать это в viewDidLoad – Shardul

+0

Извините за много вопросов. Я использовал функцию viewdidload как это. self.functionname() , но сейчас я не мог этого сделать. self.fetchEvents() «Отсутствующий аргумент для параметра № 1 в вызове», который я получил. Я пробую это. self.fetchEvents (завершенные: (NSMutableArray) ->()) { } но не ok.:/ – sashatheitguy

0

В соответствии с Вашим комментарием:

Я думаю, что его точка останова вопрос, но я не ставил точку останова. Это так странно. imgur.com/a/nQGo1 imgur.com/a/MUb4i - бурбон 2 минуты назад

Я посмотрел на свой код, что удалить viewWillAppear метод и добавить self.eventStore = EKEventStore() выше вызове функции fetchEvents в viewDidLoad.

Еще один важный момент назначить arr - self.events, а затем перезагрузить таблицу. Я только изменил тип возвращаемого использования метода следующие:

Метод:

func fetchEvents(completed: ([EKEvent]) ->()) { 
    eventStore!.requestAccessToEntityType(EKEntityType.Event, completion: { 
     granted, error in 
     let startDt = NSDate(timeIntervalSinceNow: -24 * 60 * 60); 
     let predicate = self.eventStore!.predicateForEventsWithStartDate(startDt, endDate: NSDate(), calendars: nil) 
     let events = self.eventStore!.eventsMatchingPredicate(predicate) 
     completed(events) 
    }) 
} 

Метод вызова:

fetchEvents { (arr:[EKEvent]) in 
     print(arr) 
     self.events = arr 
     //reload table 
    } 
+0

Большое вам спасибо. Работает. (без каких-либо проблем) Но мое табличное представление не загружает события в моем календаре. (У меня есть тестовое событие на сегодня.) http://imgur.com/a/InvCs – sashatheitguy

+0

Вместо '// reload table' добавить код перезагрузки таблицы – Shardul

+0

Я не понимаю. это «self.tableview.reloadData()» или какой код перезагрузки здесь? Я что-то упустил? – sashatheitguy

Смежные вопросы