簡體   English   中英

帶有UISegmentedControl的Swift UiTableView不刷新行

[英]Swift UiTableView with UISegmentedControl not refreshing rows

我有一個帶有UITableView的UIViewController。 在頂部,我有一個UISegmentedController和一個UITableView。 我希望在按分段控件時對行進行排序。 一切工作正常,行正確顯示,但是當我按下分段控制按鈕時,我調用了一種方法,該方法對已在表視圖中顯示的數組進行排序,但是除非我不這樣做,否則它們不會在視圖中刷新不要滾動到底部和頂部。 我對該數組排序后調用了tableView.reloadData()方法,但它不會更新tableview。

這是我的代碼:

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({ $0.name.compare($1.name) == NSComparisonResult.OrderedAscending })

        case 1:
            currentStat.statEvents.sortInPlace({ $0.name.compare($1.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(){ $0 == 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({ $0.dateRanges[0].compare($1.dateRanges[0]) == NSComparisonResult.OrderedAscending })
    currentStat.statEvents = selectedMarks
    navigationController!.popViewControllerAnimated(true)
}

}

我能想象發生的唯一方法-tableView在orderTable調用中為nil。

我在表到tableView的代碼分配中找不到任何地方。 如何初始化? 還值得一提的是,委托和dataSource方法中的tableView是方法的局部參數,而不是實例變量。

將其標記為IBOutlet,然后像使用textLabel和segmentedControl一樣在IB中進行設置,也可以將UIViewController更改為UITableViewController並更新IB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM