Mikey
Mikey

Reputation: 131

How to sort an array from multiple textfields with one property

I was looking for an answer for this question but I couldn't find anything. I'm new in swift programming and also in stackoverflow, so I hope anyone can help me.

I try to make an app with an "EditViewController" which is there with multiple textfields for name, prename, etc.

I'm able to save this "phonebook" entries, but I'm not able to sort the array by the property name.

The editing interface is only this code:

import UIKit

class EditViewController: UIViewController {
    @IBOutlet weak var vornameTextField: UITextField!
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var adresseTextField: UITextField!
    @IBOutlet weak var hausnummerTextField: UITextField!
    @IBOutlet weak var plzTextField: UITextField!
    @IBOutlet weak var ortTextField: UITextField!
    @IBOutlet weak var telefonnummerTextField: UITextField!
    @IBOutlet weak var berufTextField: UITextField!

    override func viewDidLoad()
    {
        super.viewDidLoad()
    }



    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
    }

}

The code for saving the textfields is:

import UIKit

class Telefonbuch: NSObject, NSCoding
{
    var name: String!
    var vorname: String!
    var beruf: String!
    var telefonnummer: String!
    var adresse: String!
    var hausnummer: String!
    var plz: String!
    var ort: String!

    init(name: String, vorname: String, beruf:String, telefonnummer:  String, adresse: String, hausnummer: String, plz: String, ort: String)
    {
        self.name = name
        self.vorname = vorname
        self.beruf = beruf
        self.telefonnummer = telefonnummer
        self.adresse = adresse
        self.hausnummer = hausnummer
        self.plz = plz
        self.ort = ort
    }

    required init?(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObjectForKey("name") as? String
        vorname = aDecoder.decodeObjectForKey("vorname") as? String
        beruf = aDecoder.decodeObjectForKey("beruf") as? String
        telefonnummer = aDecoder.decodeObjectForKey("telefonnummer") as? String
        adresse = aDecoder.decodeObjectForKey("adresse") as? String
        hausnummer = aDecoder.decodeObjectForKey("hausnummer") as? String
        plz = aDecoder.decodeObjectForKey("plz") as? String
        ort = aDecoder.decodeObjectForKey("ort") as? String
    }


    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(name, forKey: "name")
        aCoder.encodeObject(vorname, forKey: "vorname")
        aCoder.encodeObject(beruf, forKey: "beruf")
        aCoder.encodeObject(telefonnummer, forKey: "telefonnummer")
        aCoder.encodeObject(adresse, forKey: "adresse")
        aCoder.encodeObject(hausnummer, forKey: "hausnummer")
        aCoder.encodeObject(plz, forKey: "plz")
        aCoder.encodeObject(ort, forKey: "ort")
    }


    static func saveArray(data: [Telefonbuch])
    {
        if data.count == 0 {return}

        if let path = getFilePath() {

            NSKeyedArchiver.archiveRootObject(data, toFile: path)
        }
    }



    static func loadArray() -> [Telefonbuch]
    {
        if let path = getFilePath() {

           if let result = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? [Telefonbuch]
           {
            return result
            }

        }

        return [Telefonbuch]()
    }



    private static func getFilePath() -> String?
    {
        let pfd = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

        if let pfad = pfd.first {
            return pfad + "Kontakte.bin"
        }else {
            return nil
        }
    }

}

Now I would like to make the tableview, where I display the data, sorted and with header. But I'm not able to sort the [Telefonbuch] Array by property name.

import UIKit

class OverViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var addButton: UIBarButtonItem!
@IBOutlet weak var editButton: UINavigationItem!


var kontaktListe = Telefonbuch.loadArray()

override func viewDidLoad()
{
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.reloadData()
}


override func didReceiveMemoryWarning()
{
    super.didReceiveMemoryWarning()
}


@IBAction func addButtonPressed(sender: AnyObject)
{
    performSegueWithIdentifier("editSegue", sender: self)
}


@IBAction func returnToMainController(segue: UIStoryboardSegue)
{
    if let scr = segue.sourceViewController as? EditViewController
    {
        let newvorname = scr.vornameTextField.text
        let newname = scr.nameTextField.text
        let newadresse = scr.adresseTextField.text
        let newhausnummer = scr.hausnummerTextField.text
        let newpostleitzahl = scr.plzTextField.text
        let newort = scr.ortTextField.text
        let newtelefonnummer = scr.telefonnummerTextField.text
        let newberuf = scr.berufTextField.text

        let newKontakt = Telefonbuch(name: newname!, vorname: newvorname!, beruf: newberuf!, telefonnummer: newtelefonnummer!, adresse: newadresse!, hausnummer: newhausnummer!, plz: newpostleitzahl!, ort: newort!)

        kontaktListe.insert(newKontakt, atIndex: 0)
        Telefonbuch.saveArray(kontaktListe)
        tableView.reloadData()
    }
}

    extension OverViewController: UITableViewDataSource
{
    func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
    return 3
}


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


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier("ProtoCell", forIndexPath: indexPath)
    let row = indexPath.row
    cell.textLabel?.text = kontaktListe[row].name + " " + kontaktListe[row].vorname
    cell.detailTextLabel?.text = kontaktListe[row].ort

    return cell
}

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
{
    return true
}


func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
{
    if editingStyle == .Delete
    {
        kontaktListe.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        tableView.reloadData()
    }
}



extension OverViewController: UITableViewDelegate
{
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{

    performSegueWithIdentifier("detailSegue", sender: self)


}

}

Can anyone help me because I don't find a solution.

Thanks in advance.

Upvotes: 0

Views: 96

Answers (1)

fguchelaar
fguchelaar

Reputation: 4909

You should be able to sort the array with:

kontaktListe.sort({ $0.name > $1.name })

Upvotes: 2

Related Questions