2015-04-19 10 views
6

Ich könnte nicht einen besseren Weg, dies zu tun. Ich ordne alle Eigenschaften des Student-Objekts in ein 2D-Array um. Also mein Fernseher hat Sektionen.Map Objekt in 2D Array Swift für TableView Abschnitte

Ich kann auch keine statische Tabellenansicht verwenden, wenn dieses Problem nicht vorhanden wäre.

meinen Code So in der TVC

let currentUser = PFUser.currentUser()! as! MyUser 

var membershipSection:[[String:String]]! 
var detailsSection:[[String:String]]! 
var emergancySection:[[String:String]]! 
var medicalSection:[[String:String]]! 

var titlesForSection = ["MEMBERSHIP", "DETAILS", "EMERGANCY CONTACT", "MEDICAL HISTORY"] 

var combo = [[[String:String]]]() // Data Source for TableView 

// Die folgende von ViewDidLoad

func loadDisplayDataSource() { 

    combo.removeAll(keepCapacity: true) 

    var idString = "Awaiting ID Generation" 

    if student.objectId != nil { 
     idString = student.objectId! 
    } 

    membershipSection = [["Sessions":student.sessionsRemaining], ["Details":""], ["ID":idString]] 
    detailsSection = [["First Name":student.firstName], ["Last Name":student.lastName], ["DOB":""], ["Address":""], ["Phone":""], ["Email":student.email], ["Occupation":""]] 
    emergancySection = [["Name":""], ["Phone":""]] 
    medicalSection = [["Recent Surgery":""], ["Hypertension":""], ["Diabetes":""], ["Caradic":""], ["Epilesy":""], ["Syncope":""], ["Medications":""], ["Medical Details":""], ["Other Injuries":""]] 

    combo.append(membershipSection) 
    combo.append(detailsSection) 
    combo.append(emergancySection) 
    combo.append(medicalSection) 

    self.tableView.beginUpdates() 
    var range = NSMakeRange(0, self.numberOfSectionsInTableView(self.tableView)) 
    var sections = NSIndexSet(indexesInRange: range) 
    self.tableView.deleteSections(sections, withRowAnimation: UITableViewRowAnimation.None) 
    self.tableView.insertSections(sections, withRowAnimation: UITableViewRowAnimation.Fade) 
    self.tableView.endUpdates() 
} 

Gibt es einen besseren Weg, um ein Objektdaten in abzubilden Abschnitte genannt wird? Die Art, wie ich es mache funktioniert, ist aber ein wenig verwirrend. Wenn ich eine statische Ansicht verwenden könnte, wäre dies einfacher, aber ich kann einen TV-Fernseher nicht in einem normalen VC verwenden, und in diesen kann kein statisches Fernsehgerät verwendet werden. Was nervt! Gibt es einen saubereren Weg?

Kann ich dies mehr SWIFTY - eine bessere Möglichkeit, meine Combo-Datenquelle zu erstellen.

Vielen Dank für jede Beratung.

Mein Endergebnis - das funktioniert so - Ein TVC mit Abschnitten.

enter image description here

+0

Verwenden Sie 'Core Data' in irgendeiner Weise, um Ihre Daten zu erhalten? – Kutyel

+0

Nein, mit Parse – DogCoffee

Antwort

1

Ich bin nicht ganz sicher, was Sie fragen. Wofür wird "Combo" verwendet?

Wenn Sie Ihre Daten einfach sauberer verpacken möchten, sind die Strukturen in Swift dafür geeignet. Etwas wie:

struct EmergencySection{ 
    var name: String! 
    var phone: String! 
} 

//then to instantiate in loadDisplayDataSource 
var emergencySection = EmergencySection(name: "", phone: "") 
combo.append(emergencySection) 
+0

Combo ist, was die Tabellenansicht an seiner Datenquelle verwendet. Aber ja, ich stimme zu, eine Struktur wird die Dinge aufräumen. – DogCoffee

0

Hier ist, wie ich es tue, etwas sauberer

private struct Details { 

    static let title = "DETAILS" 
    static let firstName = (key:"First Name", index:0) 
    static let lastName = (key:"Last Name", index:1) 
    static let dob = (key:"DOB", index:2) 
    static let address = (key:"Address", index:3) 
    static let phone = (key:"Phone", index:4) 
    static let email = (key:"Email", index:5) 
    static let occupation = (key:"Occupation", index:6) 

    static func splitIntoDictionaries(student: Student) -> [[String:String]] { 
     return [ 
      [firstName.key:student.firstName], // 0 
      [lastName.key:student.lastName], // 1 
      [dob.key:""], 
      [address.key:""], 
      [phone.key:""], 
      [email.key:student.email], 
      [occupation.key:""] 
     ] 
    } 
} 
0

Versuchen RETableViewManager verwenden, ist es für solche Aufgaben ziemlich genial ist. Nun, es ist vollständig Objective-C, aber zumindest könnte man es sich kurz ansehen.

0

Wie wäre es damit?

import UIKit 

class 
ViewController: UITableViewController { 

    var combo = [ [ String: AnyObject? ] ]() 
    let titlesForSection = ["MEMBERSHIP", "DETAILS", "EMERGANCY CONTACT", "MEDICAL HISTORY"] 

    override func 
    viewDidLoad() { 
     super.viewDidLoad() 


     // Something about studen data 


     combo = [ 
      [ "Sessions":"student.sessionsRemaining", "Details":"", "ID":"idString" ] 
     , [ "First Name":"student.firstName", "Last Name":"student.lastName", "DOB":"", "Address":"", "Phone":"", "Email":"student.email", "Occupation":"" ] 
     , [ "Name":"", "Phone":"" ] 
     , [ "Recent Surgery":"", "Hypertension":"", "Diabetes":"", "Caradic":"", "Epilesy":"", "Syncope":"", "Medications":"", "Medical Details":"", "Other Injuries":"" ] 
     ] 
    } 

    override func 
    numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return combo.count 
    } 

    override func 
    tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return combo[ section ].count 
    } 

    override func 
    tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return titlesForSection[ section ] 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let v = tableView.dequeueReusableCellWithIdentifier("SomeIdentifier") as! UITableViewCell 
     let w = combo[ indexPath.section ] 
     let wKey = Array(w.keys)[ indexPath.row ] 
     v.textLabel!.text = wKey 
     v.detailTextLabel!.text = w[ wKey ] as? String 
     return v 
    } 
} 
+0

Hauptproblem ist die Erstellung der Combo, ich werde aktualisieren, was ich derzeit in meiner Antwort verwende. Das massive Diktat. ist einfach chaotisch – DogCoffee

0

Sie können eine UITableViewController mit statischen Zellen in einem normalen UIViewController verwenden, indem Sie es als Kind-View-Controller hinzufügen.

parentVC.addChildViewController(childVC) 
childVC.view.frame = parentVC.view.bounds 
parentVC.view.addSubview(childVC.view) 
childVC.didMoveToParentViewController(parentVC) 
+0

interessant, ich habe verschiedene Möglichkeiten gesehen, dies zu tun, aber nicht diese Methode. Wird sicher sein, in einem Stadium zu versuchen. – DogCoffee

+0

Haben Sie das versucht, aber Sie können die statischen Zellen im Storyboard nicht erstellen? – DogCoffee

+0

Wenn Sie einem 'UIViewController' eine' UITableView' hinzufügen, dann können Sie keine statischen Zellen hinzufügen. Meine Lösung besteht darin, einen 'UITableViewController' mit statischen Zellen zu erstellen, dies funktioniert im Storyboard, und dann bette ich diesen in' UIViewController' als Child-View-Controller ein. – pteofil