Swift 带有 UISegmentedControl 的 UiTableView 不刷新行

Swift UiTableView with UISegmentedControl not refreshing rows

我有一个带有 UITableView 的 UIViewController。 在顶部我有一个 UISegmentedController,然后是一个 UITableView。 我希望在您按下分段控件时对行进行排序。一切正常,行显示正确,但是当我按下分段控制按钮时,我调用了一个方法来对显示在 table 视图中的数组进行排序,但它们没有在查看除非我不滚动到底部和顶部。我在对该数组排序后调用方法 tableView.reloadData(),但它不会更新 table 视图。

这是我的代码:

import UIKit
import EventKit


extension RangeReplaceableCollectionType where Generator.Element : Equatable {

  mutating func removeObject(object : Generator.Element) {
    if let index = self.indexOf(object) {
        self.removeAtIndex(index)
    }
  }
}

class EventsViewController: UIViewController {

var calendarName:String!
var currentStat = Stat()
var eventStore = EKEventStore() //represents the Calendar database. Point of contact for accessing calendar
var icloudEventSource: EKSource?  //represents the account that a calendar belongs to.
var startDate=NSDate().dateByAddingTimeInterval(-31556926)
var endDate=NSDate().dateByAddingTimeInterval(31556926)
var yourCalendar: EKCalendar?
var calendar: EKCalendar? //represents a calendar in Event Kit
var numberOfCalendars : Int = 0
var calendarsArray = NSMutableArray()
var calendarsPrueba : [EKCalendar]?
var calendarioSeleccionado:String!
var delegate: passDataBackDelegate?
var events : [EKEvent]!
var tableView : UITableView?
var selectedMarks = [StatEvents]()
var selectedIndex = [NSIndexPath]()
var orderedStatEvents = [StatEvents]()


@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var textLabel: UILabel!

@IBAction func indexChanged(sender: UISegmentedControl) {

    switch segmentedControl.selectedSegmentIndex {
        case 0:
            orderTable(0)

        case 1:
            orderTable(1)
        default:
            break; 
    }
}


func orderTable(order: Int) {
    switch order {

        case 0:
            currentStat.statEvents.sortInPlace({ [=11=].name.compare(.name) == NSComparisonResult.OrderedAscending })

        case 1:
            currentStat.statEvents.sortInPlace({ [=11=].name.compare(.name) == NSComparisonResult.OrderedDescending })
        default:
            break;
    }

    tableView?.reloadData()
}

override func viewDidLoad() {
    super.viewDidLoad()

    eventStore.requestAccessToEntityType(EKEntityType.Event,
        completion: {(granted: Bool, error:NSError?) in
            if !granted {
                print("Access to store not granted")
            }
    })


    // Buscamos la cuenta de iCloud que contiene los calendarios
    for source in eventStore.sources{
        if source.sourceType.rawValue == EKSourceType.CalDAV.rawValue && source.title.lowercaseString == "icloud"{
            icloudEventSource = source

        }
    }


    ///////Mostramos solo calendarios de iCloud//////
    if (icloudEventSource != nil){
        let calendars = icloudEventSource!.calendarsForEntityType(EKEntityType.Event)

        print("1 The iCloud event source was found = \(icloudEventSource!.title)")
        print("1 Number of calendars = \(calendars.count)")

        for calendars in calendars{
            yourCalendar = (calendars as EKCalendar)
            print(yourCalendar!.title)
            calendarsArray.addObject(yourCalendar!.title)

        }
    }else{
        print("Could not find the iCloud event source")
    }



    //////Mostramos todos los calendarios///////
    let calendars = eventStore.calendarsForEntityType(EKEntityType.Event) //Devuelve los calendarios que son eventos

    numberOfCalendars = calendars.count
    print("Number of calendars = \(calendars.count)")

    for calendars in calendars as [EKCalendar] {
        print("events = \(calendars.title)")
        calendarsArray.addObject(calendars.title)
    }


    func calendarEventsWithName( name:String ) -> [EKCalendar]? {
        let calendars = eventStore.calendarsForEntityType(EKEntityType.Event) as [EKCalendar]
        for cal in calendars {
            if cal.title == name {
                return [cal]
            }
        }
        print ("failed to find calendar")
        return nil
    }


    let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: calendarEventsWithName(currentStat.statCalendar))


    print("startDate:\(startDate) endDate:\(endDate)")
    events = eventStore.eventsMatchingPredicate(predicate) as [EKEvent]!

    let calendar = NSCalendar.currentCalendar()
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy" //format style. Browse online to get a format that fits your needs.


    if events != nil {
        print(events.count)
        for i in events {
            let components = calendar.components(.Hour, fromDate: i.startDate, toDate: i.endDate, options: [])

            currentStat.statEvents.append(StatEvents(name: i.title, dateRanges: [i.startDate, i.endDate], hours: components.hour))
        }
    } else {
        print("No hay eventos en este calendario")
    }
}




// MARK: - Table view data source

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

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return events.count
}



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as UITableViewCell
    tableView.allowsMultipleSelection = true

    cell.textLabel?.font = UIFont.systemFontOfSize(8.0)
    cell.textLabel?.text = "\(currentStat.statEvents[indexPath.row].name)  \(currentStat.statEvents[indexPath.row].dateRanges) horas=\(currentStat.statEvents[indexPath.row].hours)"

    if let selectedPaths = tableView.indexPathsForSelectedRows {
        let selected = selectedPaths.filter(){ [=11=] == indexPath }
        if selected.count > 0 {
            cell.accessoryType = .Checkmark
        } else {
            cell.accessoryType = .None
        }
    }

    return cell
}



func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    if (selectedMarks.contains(currentStat.statEvents[indexPath.row])){

        if let cell = tableView.cellForRowAtIndexPath(indexPath) {
            cell.accessoryType = .None
        }
        print("borro")           
        selectedMarks.removeObject(currentStat.statEvents[indexPath.row])

    } else {

        if let cell = tableView.cellForRowAtIndexPath(indexPath) {
            cell.accessoryType = .Checkmark
        }
        print("añado")
        selectedMarks.append(currentStat.statEvents[indexPath.row]) //add the object to selectedMarks
    }
    selectedIndex = tableView.indexPathsForSelectedRows!
    tableView.reloadData()

}


@IBAction func done(sender: AnyObject) {

    selectedMarks.sortInPlace({ [=11=].dateRanges[0].compare(.dateRanges[0]) == NSComparisonResult.OrderedAscending })
    currentStat.statEvents = selectedMarks
    navigationController!.popViewControllerAnimated(true)
}

}

我可以想象它正在发生的唯一方式 — tableView 在 orderTable 调用中为 nil。

我在 table 到 table 视图的代码分配中找不到任何地方。它是如何初始化的?还值得一提的是,table在委托和数据源方法中查看方法的局部参数,而不是实例变量。

将其标记为 IBOutlet 并在 IB 中设置它,就像您对 textLabel 和 segmentedControl 所做的那样,或者您可以将 UIViewController 更改为 UITableViewController 并更新 IB。