【问题标题】:Building table view while getting number of rows from completion block从完成块获取行数时构建表视图
【发布时间】:2015-10-26 15:56:52
【问题描述】:

我正在尝试在 swift 2 中检索日历事件,但我无法解决这个问题:要构建表格视图,我需要知道单元格的数量,我可以从这样的方法中获得(为了简单数组是字符串):

func fetchCalendarEvents () -> [String] {

    var arrayW = [String]()

    let eventStore : EKEventStore = EKEventStore()


    eventStore.requestAccessToEntityType(EKEntityType.Event, completion: {
        granted, error in
        if (granted) && (error == nil) {
            print("access granted: \(granted)")

            //do stuff...
        }
        else {
            print("error: access not granted  \(error)")

        }
    })
    return arrayW
}

我在viewDidLoad中调用这个方法,并将数组保存到var eventArray。立即调用以下方法:

 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return eventArray.count
}

问题是此时 fetchCalendarEvents 的完成块还没有完成,因此返回 0(虽然日历中有事件)。

我的问题:如何处理从我从方法获得的数组构建表格视图,该数组具有完成块,并且需要一些时间才能完成?

【问题讨论】:

    标签: ios xcode swift swift2 ios9


    【解决方案1】:

    在您的日历完成块中添加 aBlockSelf.tableView.reloadData() 以使用获取的数据重新加载您的表格。

    这里的aBlockSelf 是对self 的弱引用,因为它被传递给了一个块。

    编辑:发表 OP 评论 - 试试这个:

    weak var aBlockSelf = self
    

    【讨论】:

    • aBlockSelf 在 swift 2 中给了我错误:使用未解析的标识符 aBlockSelf
    【解决方案2】:
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if (eventArray.count == 0) { //or unwrap value, depends on your code
            return 0 // or 1, if you want add a 'Loading' cell
        } else {
            return eventArray.count
        }    
    }
    

    而且,当您收到eventArray 时,只需重新加载表格即可

    //without animation
    tableView.reloadData()
    //or with, but it can get little tricky
    tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation:UITableViewRowAnimationRight];
    

    【讨论】:

      【解决方案3】:

      制作 2 个单元格类型。一种用于事件,另一种只是说“正在加载...”。虽然您正在进行的块仅显示 1 个带有“正在加载...”的单元格。当事件将检索隐藏此单元格并重新加载带有事件的表。
      干杯。

      【讨论】:

        【解决方案4】:

        好的,似乎所有答案都相对正确,但并不完全按照直接的方式。对我有用的是,我只需要在 for 循环之后重新加载表格视图,而不是返回数组,其中数组是建立的:

        func fetchCalendarEvents () {
        
            let eventStore : EKEventStore = EKEventStore()
        
            eventStore.requestAccessToEntityType(EKEntityType.Event, completion: {
                granted, error in
                if (granted) && (error == nil) {
                    print("access granted: \(granted)")
                    let startDate=NSDate().dateByAddingTimeInterval(-60*60*24)
                    let endDate=NSDate().dateByAddingTimeInterval(60*60*24*3)
                    let predicate2 = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: nil)
        
                    print("startDate:\(startDate) endDate:\(endDate)")
                    let events = eventStore.eventsMatchingPredicate(predicate2) as [EKEvent]!
        
                    if events != nil {
        
                        var arrayOfEvents = [CalendarEventObject]()
        
                        for event in events {
                            var eventObject: CalendarEventObject
        
                            //  (ಠ_ಠ)  HARDCODEDE
                            eventObject = CalendarEventObject(id: 0, title: event.title, location: event.location!, notes: event.notes!, startTime: event.startDate, endTime: event.endDate, host: "host", origin: "origin", numbers: ["0611111111", "0611111112"], passcodes: ["123456", "123457"], hostcodes: ["123458", "123459"], selectedNumber: "0611111113", selectedPasscode: "123457", selectedHostcode: "123459", scheduled: true, parsed: false, update: true, preferences: [], eventUrl: "www.youtube.com", attendees: [])
        
                            arrayOfEvents.append(eventObject)
        
                        }
        
                        self.eventArray = arrayOfEvents
        
                        //reload data after getting the array
                        dispatch_async(dispatch_get_main_queue(), { () -> Void in
                            self.tableView.reloadData()
                        })
                    }
                }
                else {
                    print("error: access not granted  \(error)")
        
                }
            })
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-01
          • 2014-10-28
          • 2014-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          相关资源
          最近更新 更多