![](/img/trans.png)
[英]How To Reload Data UITableView using UISegmentedControl in swift
[英]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.