带有 UISegmentedControl 的 Swift UiTableView 不刷新行

标签 swift uitableview uisegmentedcontrol

我有一个带有 UITableView 的 UIViewController。 在顶部我有一个 UISegmentedController 和一个 UITableView。 我希望当您按下分段控件时对行进行排序。一切工作正常,行显示正确,但是当我按下分段控制按钮时,我调用一个方法对 TableView 中显示的数组进行排序,但它们不会在 View 中刷新,除非我不这样做不要滚动到底部和顶部。我在对该数组进行排序后调用了 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 调用中为零。

我在代码中找不到将表分配给tableView的任何地方。它是如何初始化的?还值得一提的是,delegate 和 dataSource 方法中的 tableView 是方法的本地参数,而不是实例变量。

将其标记为 IBOutlet 并将其设置在 IB 中,就像使用 textLabel 和 SegmentedControl 一样,或者您也可以将 UIViewController 更改为 UITableViewController 并更新 IB。

关于带有 UISegmentedControl 的 Swift UiTableView 不刷新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170964/

相关文章:

ios - Swift 中的群组电话 session

objective-c - 有没有办法将分段表格 View 更改为向下钻取表格 View ?

ios - 使用静态单元格隐藏 UITableView 中的单元格 - 并且没有自动布局崩溃

ios - Apple Store 审核指南、功能

ios - 通过更改背景颜色向用户显示他按下了按钮的简单方法?

swift - 将 CAShapeLayer 添加到 UIButton 不起作用

ios:如何在tableview中添加顶部和底部边框?

image - 在 Swift 中更改分段控件背景图像

ios - 从 navigationItem 中删除项目以编程方式显示 navigationItems 标题

ios - 在 UINavigationController 中添加一个 UISegmentedControl 作为 titleView