• Keine Ergebnisse gefunden

TableView mit Edit/New/Del View

N/A
N/A
Protected

Academic year: 2021

Aktie "TableView mit Edit/New/Del View"

Copied!
68
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

TableView mit Edit/New/Del View

(2)

TableView mit Edit/New/Del View

(3)

TableView mit Edit/New/Del View

(4)

TableView mit Edit/New/Del View

(5)

Vorl19_TableViewChangedEditNewDelete

(6)

TableView mit Edit/New/Del View: MainView

Anklicken ViewController im Projektbaum

Klasse Stadt anlegen: Cmd N

(7)

TableView mit Edit/New/Del View: MainView

Name der Klasse: Stadt

SubClass: NSObject

(8)

TableView mit Edit/New/Del View: MainView

Speichern auf Festplatte

(9)

TableView mit Edit/New/Del View: MainView

Klasse Stadt im Quellcode

(10)

Quellcode der Klasse Stadt (1. Version)

TableView mit Edit/New/Del View: MainView

class Stadt: NSObject { var name : String = ""

var bemerkung : String = ""

init(Name name:String, Bemerkung bem:String){

self .name = name

self .bemerkung = bem }

}

(11)

class Stadt: NSObject { var name : String = ""

var bemerkung : String = ""

init(Name name:String, Bemerkung bem:String){

self.name = name

self.bemerkung = bem }

public func saveDefault(_ defaults:UserDefaults, _ i:Int) { defaults.set(name,forKey:"name"+String(i))

defaults.set(bemerkung,forKey:"bemerkung"+String(i)) } // saveDefault

public func loadDefault(_ defaults:UserDefaults, _ i:Int) { name = defaults.string(forKey:"name"+String(i))!

bemerkung = defaults.string(forKey:"bemerkung"+String(i))!

} // saveDefault

}

Vollständiger Quellcode der Klasse Stadt

(12)

TableView mit Edit/New/Del View

Aktuelle Struktur

(13)

Ablauf: Cmd+Shif+L

1. ein horizontalen StackView einfügen

2. ein Label-Element in den ViewController einfügen

Text: Städte

3. ein Label-Element in den ViewController einfügen

Text: Info

4. ein Button neben dem Label einfügen

Text: Edit

5. ein Button neben dem Label einfügen

Text: New

6. ein Button neben dem Label einfügen

Text: Delete

7. Constraints einbauen (10,10,10, gleiche Breite)

8. ein TableView-Element in den ViewController einfügen

9. Constraint (10,10,10,10)

(14)

Städte Edit New Del

Übersicht über die UI-Struktur

Info

(15)

Aktuelle Struktur Alle 5 Elemente markiert

(16)

Aktuelle Struktur des horizontalen Stackviews

(17)

Aktuelles

Aussehen

(18)

TableView mit Edit/New/Del View

1. staedte-Array deklarieren und erzeugen

var staedte = [Stadt]()

2. Outlet erzeugen

@IBOutlet var labelRow: UILabel!

@IBOutlet var labelInfo: UILabel!

@IBOutlet var tableview: UITableView!

@IBOutlet var bnEdit: UIButton!

@IBOutlet var bnNew: UIButton!

@IBOutlet var bnDelete: UIButton!

3. Bilder ins Projekt importieren

bilder1.zip

(19)

Bildsymbole im Projekt

(20)

func setStaedte () {

staedte.append( Stadt(Name: "New York", Bemerkung: "Manhattan") ) staedte.append( Stadt(Name: "Mailand", Bemerkung:"Mailander Scala") )

staedte.append( Stadt(Name: "Rom", Bemerkung: "Vatikan, Michelangelo") ) staedte.append( Stadt(Name: "Moskau", Bemerkung: "Roter Platz") )

staedte.append( Stadt(Name: "Wernigerode", Bemerkung: "HS Harz") ) staedte.append( Stadt(Name: "Hamburg", Bemerkung: "Michel") )

staedte.append( Stadt(Name: "Paris", Bemerkung:"Eifelturm") )

staedte.append( Stadt(Name: "Brüssel", Bemerkung: "Atomium") )

staedte.append( Stadt(Name: "Magdeburg", Bemerkung: "Leere Stadionsplätze") ) staedte.append( Stadt(Name: "Stockhom", Bemerkung: "Nobelpreis") )

staedte.append( Stadt(Name: "München", Bemerkung: "Oktoberfest") ) staedte.append( Stadt(Name: "Lübeck", Bemerkung: "Marzipan") )

staedte.append( Stadt(Name: "Kiel", Bemerkung: "Kieler Woche") )

staedte.append( Stadt(Name: "Amsterdam", Bemerkung: "Grachten") )

staedte.append( Stadt(Name: "Dresden", Bemerkung: "Das grüne Zimmer") ) staedte.append( Stadt(Name: "London", Bemerkung: "Tower") )

staedte.append( Stadt(Name: "San Fransisco", Bemerkung: "Golden Gate Bridge") ) staedte.append( Stadt(Name: "Halberstadt", Bemerkung: "John Cage") )

staedte.append( Stadt(Name: "Pisa", Bemerkung: "Schultest") ) staedte.append( Stadt(Name: "Athen", Bemerkung: "Akropolis ") )

staedte.append( Stadt(Name: "Bilbao", Bemerkung: "Guggenheim-Museum") )

staedte.append( Stadt(Name: "Salzburg", Bemerkung: "Festung Hohensalzburg") ) staedte.append( Stadt(Name: "Rio de Janeiro", Bemerkung: "Zuckerhut") )

}

(21)

class ViewController: UIViewController,

UITableViewDelegate, UITableViewDataSource {

1. Delegate eintragen:

TableView mit Edit/New/Del View

func numberOfSections(in tableView: UITableView) -> Int { return 1

}

func tableView(_ tableView: UITableView,

numberOfRowsInSection section: Int) -> Int { return staedte.count

}

(22)

func numberOfSections(in tableView: UITableView) -> Int { return 1

}

func tableView(_ tableView: UITableView,

numberOfRowsInSection section: Int) -> Int { return staedte.count

}

TableView mit Edit/New/Del View

(23)

1. UITableViewCellStyle.default:

Bild links, Titel rechts

2. UITableViewCellStyle.subtitle:

Bild links, Titel rechts, darunter Zusatzinformation 3. UITableViewCellStyle.value1:

Bild links, Titel in der Mitte, rechts Zusatzinformation 4. UITableViewCellStyle.value2:

Zusatzinformation links, rechts Titel

5. Variablen

text

detailTextLabel

imageView

Arten der UITableViewCellStyle

(24)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->

UITableViewCell {

var cell = tableView.dequeueReusableCell(withIdentifier: "cell") if cell == nil {

cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")

}

let row = (indexPath as NSIndexPath).row let stadt:Stadt = staedte[ row ]

cell?.textLabel!.text = stadt.name

cell?.detailTextLabel!.text=stadt.bemerkung switch (stadt.name.count >> 1) {

case 0:

cell?.imageView!.image = UIImage(named: "Bild1") case 1:

cell?.imageView!.image = UIImage(named: "Bild2") case 2:

cell?.imageView!.image = UIImage(named: "Bild3") default:

cell?.imageView!.image = UIImage(named: "Bild7") }

return cell!

}

Quellcode

(25)

Delegate Methode

// SelectecIndexChanged

func tableView(_: UITableView, didSelectRowAt: IndexPath) { bnEdit.isEnabled=true

bnDelete.isEnabled=true

let row = (didSelectRowAt as NSIndexPath).row labelRow.text="row: "+String(row)

}

override func viewDidLoad() { super .viewDidLoad()

setStaedte()

tableview .delegate = self

tableview .dataSource = self

}

(26)

Aktueller Stand

(27)

1. ein uiLabel-Element in den neuen ViewController einfügen

Inhalt: Datensatz bearbeiten / löschen / Neuer Datensatz (Fontsize: 25) 2. ein uiLabel-Element in den neuen ViewController einfügen

Inhalt: Name

3. ein uiTextfield-Element in den neuen ViewController einfügen

Name: tName als Outlet

4. ein uiLabel-Element in den neuen ViewController einfügen

Inhalt: Bemerkung

5. ein uiTextView-Element in den neuen ViewController einfügen

Name: tBemerkung als Outlet 6. uiButton für dem Ok-Schalter

Text: Ok

7. uiButton für dem Cancel-Schalter

Einfügen eines ViewControllern (Cmd+Shift+L)

Neuer ViewController zum Bearbeiten der Daten

(28)

Neuer ViewController

(29)

1. Aufruf des Einfüge-Dialogs mit Cmd+N. 


2. Auswahl des Symbols „Cocoa Touch Class“. 


3. Classname „ChangeValuesViewController“ 


4. SubClass: „UIViewController“ 


5. Im „Property Inspector“ des ViewControllers den Namen der Swift- Datei eintragen.

TableView mit Edit/New/Del View

Einfügen einer neuen Quellcode-Datei für den ViewController

(30)

Swift-Datei für den neuen ViewController

(31)

Swift-Datei für den neuen ViewController

(32)

Swift-Datei für den neuen ViewController

(33)

Swift-Datei für den neuen ViewController

(34)

Verknüpfen des ViewControllers mit der Swift-Datei

Swift-Datei für den neuen ViewController

Anklicken des linke Schalters (oben) im ViewController

Wechseln zum Property-Menu (Viereck)

Auswahl in der ComboBox (runterscollen)

(35)

TableView mit Edit/New/Del View

nächste Schritte:

Aufruf des ChangeControllers

Eintragen der Werte

Abfangen der Änderungen

(36)

TableView mit Edit/New/Del View

Verknüpfen des Schalters „Edit“ zum ViewController

Anklicken des Schalters

Ctrl-Taste drücken

ziehen zum ChangeViewController

Menüeintrag: „show“

(37)

TableView mit Edit/New/Del View

Verknüpfen des Schalters „New“ zum ChangeViewController

Menüeintrag: „show“

(38)

TableView mit Edit/New/Del View

Verknüpfen des Schalters „Delete“ zum ChnageViewController

Menüeintrag: „show“

(39)

Aktueller Stand des Main.Storyboard

(40)

enum für die drei Varianten

Cmd N:

(41)

enum für die drei Varianten enum für die drei Varianten

Speichern

(42)

enum für die drei Varianten

(43)

Attribute und Referenzen des ChangeViewController

Interface / Protokoll:

UITextViewDelegate (ChangedEvent für die TextView)

Variablen:

var stadt : Stadt?=nil

var modus : ChangeMode = ChangeMode.EDIT

Outlets:

@IBOutlet var labelTitle: UILabel!

@IBOutlet var tName: UITextField!

@IBOutlet var tBemerkung: UITextView!

@IBOutlet var bnOk: UIButton!

(44)

ChangedEvent:

tNameEditingChanged

ChangedEvents des ChangeViewController

(45)

ChangedEvents des ChangeViewController

@IBAction func tNameEditingChanged(_ sender: AnyObject) { if stadt != nil {

stadt!.name=tName.text!

} }

// Delegate !!!

func textViewDidChange(_ textView: UITextView) { if stadt != nil {

stadt!.bemerkung=tBemerkung.text!

}

}

(46)

c

switch (modus) {

case ChangeMode.EDIT:

labelTitle.text = "Datensatz bearbeiten"

case ChangeMode.NEW:

labelTitle.text = "Neuer Datensatz"

case ChangeMode.DELETE:

labelTitle.text = "Datensatz löschen "

default:

labelTitle.text = "ChangeModus ist falsch"

}

if stadt == nil {

bnOk.isEnabled = false // New tName.text = "?"

tBemerkung.text = "?"

}

else {

tName.text = stadt!.name

tBemerkung.text = stadt!.bemerkung }

tBemerkung.delegate=self

(47)

Methode, die vor dem Anzeigen des 2. ViewControllers aufgerufen wird

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let button:UIButton = sender as? UIButton {

// Abfrage, welcher Schalter: Übergabe der Stadt if button==bnEdit {

if let indexPath = tableview.indexPathForSelectedRow {

let stadt:Stadt = staedte[(indexPath as NSIndexPath).row]

if let dest = segue.destination as? ChangeValuesViewController { dest.stadt=stadt

dest.modus = ChangeMode.EDIT labelInfo.text=stadt.name

} }

} // edit } / prepare

im Main-ViewController:

prepare-Methode wird immer aufgerufen, wenn man auf einen

Schalter klickt.

(48)

Testen der Übergabe der Daten an den 2. ViewController

(49)

ChangeValuesViewController: Rücksprünge !

Man benötigt im HauptViewController zwei Methoden:

// Rücksprung vom ChangeViewController Abbruch

@IBAction func unwindCancel(_ segue:UIStoryboardSegue) { // keine Aktion notwendig

} // unwindToEditViewCancel

// Rücksprung vom ChangeViewController Ok

@IBAction func unwindOk(_ segue:UIStoryboardSegue) {

// holen der neuen Werte und speichern oder löschen

}

(50)

Verknüpfen der Schalter mit den unWind-Methoden Schalter anklicken, Ctrl-Taste drücken

ziehen zum Schalter exit

ChangeValuesViewController: Rücksprünge !

Schalter Ok

Schalter Cancel

(51)

ChangeValuesViewController: Rücksprünge !

Einbau der Rücksprung-Methode im 2. ViewController

@IBAction override func unwind(

for unwindSegue: UIStoryboardSegue,

towards subsequentVC: UIViewController) { if stadt != nil {

stadt!.name=tName.text!

stadt!.bemerkung=tBemerkung.text!

}

}

(52)

Speichern der Änderung im HauptController

@IBAction func unwindOk(_ segue:UIStoryboardSegue) {

if let src = segue.source as? ChangeValuesViewController { if let indexPath = tableview.indexPathForSelectedRow {

switch (src.modus) {

case ChangeMode.EDIT:

let stadt:Stadt = staedte[(indexPath as NSIndexPath).row]

stadt.name = (src.stadt?.name)!

stadt.bemerkung = (src.stadt?.bemerkung)!

labelInfo.text=stadt.name+"!"

tableview.reloadRows(at: [indexPath], with: UITableView.RowAnimation.middle) }

} // if let indexPath = tableview.in } // if let src = segue.source as?

} // unwindOk

(53)

Testen des Änderns

(54)

Modus New

if button==bnNew {

if let dest = segue.destination as? ChangeValuesViewController { dest.modus = ChangeMode.NEW

}

} // New

Methode:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

(55)

Modus New

case ChangeMode.NEW:

let stadt:Stadt = Stadt(Name: "",Bemerkung: "") stadt.name = (src.stadt?.name)!

stadt.bemerkung = (src.stadt?.bemerkung)!

labelInfo.text=stadt.name staedte.append(stadt)

tableview.reloadData()

Methode:

@IBAction func unwindOk(_ segue:UIStoryboardSegue) {

(56)

Modus Delete

if button==bnDelete {

if let indexPath = tableview.indexPathForSelectedRow {

let stadt:Stadt = staedte[(indexPath as NSIndexPath).row]

if let dest = segue.destination as? ChangeValuesViewController { dest.stadt=stadt

dest.modus = ChangeMode.DELETE labelInfo.text=stadt.name

} }

}

Methode:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

(57)

Modus Delete

case ChangeMode.DELETE:

let index = indexPath.row staedte.remove(at: index) tableview.reloadData() bnEdit.isEnabled=false bnDelete.isEnabled=false

Methode:

@IBAction func unwindOk(_ segue:UIStoryboardSegue) {

(58)

Speichern und Laden der Daten (default-Datei)

Prinzip

Klasse StadtDB

Methode saveStaedte

Speichern der Anzahl der Elemente

Speichern der einzelnen Städte

Eigenständige Methode in der Klasse

Methode loadStaedte

Lesen der Anzahl der Elemente

Laden der einzelnen Städte

Eigenständige Methode in der Klasse

(59)

Anlegen der Klasse StaedteDB

cmd N

(60)

Anlegen der Klasse StaedteDB

(61)

Anlegen der Klasse StaedteDB

(62)

Anlegen der Klasse StaedteDB

public func saveStaedte(staedte: Array<Stadt>) {

let defaults = UserDefaults.standard

defaults.set(staedte.count,forKey:"staedteCount") var i:Int=0

for stadt in staedte {

stadt.saveDefault(defaults, i) i+=1

}

} // saveStaedte

(63)

Anlegen der Klasse StaedteDB

public func loadStaedte() -> Array<Stadt> { var staedte=[Stadt]()

let defaults = UserDefaults.standard

let n = defaults.integer(forKey:"staedteCount")

for i in 0...n-1 {

let stadt = Stadt(Name: "",Bemerkung: "") stadt.loadDefault(defaults, i)

staedte.append(stadt) }

return staedte

} // loadStaedte

(64)

Klasse Stadt

public func saveDefault(_ defaults:UserDefaults, _ i:Int) {

defaults.set(name,forKey:"name"+String(i))

defaults.set(bemerkung,forKey:"bemerkung"+String(i)) } // saveDefault

public func loadDefault(_ defaults:UserDefaults, _ i:Int) {

name = defaults.string(forKey:"name"+String(i))!

bemerkung = defaults.string(forKey:"bemerkung"+String(i))!

} // loadDefault

(65)

Swift-Datei Main-ViewController var staedte = [Stadt]()

let staedteDB:StaedteDB = StaedteDB()

override func viewDidLoad() { super .viewDidLoad()

let b=true if (b) {

setStaedte() }

else {

staedte = stadtDB.loadStaedte() }

}

(66)

Swift-Datei Main-ViewController

case ChangeMode.EDIT:

let stadt:Stadt = staedte[(indexPath as NSIndexPath).row]

staedteDB.saveStaedte(staedte: staedte)

case ChangeMode.NEW:

let stadt:Stadt = Stadt(Name: "",Bemerkung: "")

staedteDB.saveStaedte(staedte: staedte)

case ChangeMode.DELETE:

let index = indexPath.row

staedteDB.saveStaedte(staedte: staedte)

(67)

long press Action

let longPressGestureRecognizer = UILongPressGestureRecognizer(

target: self,

action: #selector(addAnnotation(press:)))

longPressGestureRecognizer.minimumPressDuration = 2.0

tableview.addGestureRecognizer(longPressGestureRecognizer)

(68)

long press Action

@objc func addAnnotation(press:UILongPressGestureRecognizer) { if (press.state == .began) {

let touchPoint = longPressGestureRecognizer.location(in: self.view) if let indexPath = tableview.indexPathForRow(at: touchPoint) {

let index = indexPath.row

labelInfo.text = "press: " + String(index) }

} // if (press.state == .began) { }

Referenzen

ÄHNLICHE DOKUMENTE

Da der Autor durch seine Stellung bei den da- maligen Eisenbahnern sehr be- kannt war, könnten auch ehema- lige Kollegen mit ihm und seiner Familie nach dem Krieg in Ver-

Die Angaben sind nach Kreditarten, Fristigkeiten, Gläubi- ger- und Schuldnerländern sowie nach Euro und Fremd- währung gegliedert. Kreditbeziehungen zu verbundenen Unternehmen

Control variables left out are: lagged new lending (4 quarters), new lending of county specific and nationwide benchmark bank including their lags, share of maturing loans,

hen, nicht für Zwecke des Wiederautoaus ein- gesetzt, ·sondern konsumtiv oder tür weniger vordringliche Investitionen verwendet würden. Im Wohnungsbau, in der

stituten - diese stiegen vielmehr sogar um 5'0 Mill. DM-; indessen scheint hier das Bild durch Berichtigungen getrübt zu sein. Ein sicheres Indiz der

system abhängig, so daß am Jahresende etwa 34 v. der Kredite der Geschäftsbanken an die Nichtbankenkundschaft vom Zentralbank- system refinanziert waren. Geld- und

Obwohl sie mit ihren 18 Jahren die Jüngste von uns dreien ist, hat sie so etwas wie eine &#34;Mama&#34; - Funktion und versucht zumindest Andrea und mich etwas einzubremsen, wenn wir

Die Gesamtzahl der Mitarbeiter im Werk beträgt 2870, das Werk umfaßt eine Nutzfläche von. ·192.000 m 2 • Es beschäftigt sich vor