Universellen Code in einer Datei zusammenfassen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Universellen Code in einer Datei zusammenfassen

    Guten Morgen zusammen,

    kann mir jemand sagen, wonach ich suchen muß um als Anfänger etwas über folgendes Thema lesen zu können.

    Ich habe mehrere Views, die sich zwar vom Inhalt her unterscheiden, aber großteils nicht vom logischen Aufbau. Es wäre doch daher deutlich effizienter, den gemeinsamen Code z.B. über das Aussehen eines Textfeldes oder dessen Verhalten z.B. NumberFormatter etc. in eine Datei, nennen wir sie Codesammlung zu schreiben, anstatt den selben Code in 10 Views zu tippen.

    Hierzu bräuchte ich mal ein Beispiel zur Inspiration bzw. etwas Lesestoff um mich Bilden zu können, hab aber kein Plan, mit was ich Google füttern muß.

    Mir stellen sich Fragen wie:

    - welche Fileart nehme ich? Swift?
    - Lege ich in der dann Variablen fest und berufe mich in den Views auf diese? Nur wie mach ich das im Detail bez. Code?
    - Was gibts noch, auf das ich achten muß?


    Besten Dank und schon mal ein schönes Wochenende!

    mac
  • Wie gesagt, das Ganze ist für mich Neuland.

    Einerseits möchte ich den Rahmen, Schattierung etc. für meine Textfelder festlegen.
    Dann habe ich mehrere TableViewCells, in denen sich Textfelder befinden, in denen man via .currency Geldbeträge eingeben kann.
    Als Nächstes kommen ein paar Zeilen Code, die meine Textfelder so positionieren, daß das Textfeld, in welches etwas eingegeben wird, nicht von der erscheinenden Tastatur verdeckt wird.
    Irgendwann folgt auch noch die Mathematik in meiner App. Die sollte m.e. auch in einer extra Datei stehen und nicht verteilt auf x Dateien.

    Da denke ich einfach, zentral zusammenfassen ist besser. Nur fehlt mir eine Anleitung/Literatur für einen optimalen Aufbau.
  • Guten Morgen zusammen,

    also ich hab jetzt gefühlt mal das halbe www durchforstet aber nicht wirklich das gefunden, was ich exakt suche. Das Thema Klassen und Vererbung hab ich soweit in der Theorie verstanden.
    Eine grobe Idee hab ich schon, aber es sind noch ein paar Fragen offen, die ich gerne an den folgenden beiden Codebeispielen durchgehen würde:

    Das soll der Code meiner Design Datei sein in welche künftig aller Code rein soll, der mehrere VC's betrifft:

    Quellcode

    1. //
    2. // DesignFile.swift
    3. // Life Simulator
    4. //
    5. // Created by Bertone 105 on 11.05.18.
    6. // Copyright © 2018 Bertone 105. All rights reserved.
    7. //
    8. import Foundation
    9. import UIKit
    10. class CashTextField: UITableViewCell, UITextFieldDelegate {
    11. var CashTextField: UITextField!
    12. var amt: Int = 0
    13. func shape() {
    14. CashTextField.delegate = self
    15. CashTextField.placeholder = updateAmount()
    16. // Initialization code
    17. self.CashTextField.layer.borderColor = UIColor(red: 200/255, green: 200/255, blue: 200/255, alpha: 1).cgColor
    18. self.CashTextField.layer.borderWidth = CGFloat(Float(1.0));
    19. }
    20. }
    21. // Methods or Functions
    22. func hideKeyboard() {
    23. CashTextField.resignFirstResponder()
    24. }
    25. func textField(_ _textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    26. if let digit = Int(string) {
    27. amt = amt * 10 + digit
    28. CashTextField.text = updateAmount()
    29. }
    30. if string == "" {
    31. amt = amt/10
    32. CashTextField.text = updateAmount()
    33. }
    34. return false
    35. }
    36. func updateAmount() -> String? {
    37. let formatter = NumberFormatter()
    38. formatter.numberStyle = NumberFormatter.Style.currency
    39. let amount = Double(amt/100) + Double(amt%100)/100
    40. return formatter.string(from: NSNumber(value: amount))
    41. }
    42. // Display will go back when clicking return
    43. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    44. CashTextField.resignFirstResponder()
    45. return true
    46. }
    Alles anzeigen


    Und dies ist der Code einer meiner TableViewCells, die den Code der Design Datei verwenden sollen:

    Quellcode

    1. //
    2. // PaymentsOnceTVCell.swift
    3. // Life Simulator
    4. //
    5. // Created by Bertone 105 on 06.05.18.
    6. // Copyright © 2018 Bertone 105. All rights reserved.
    7. //
    8. import UIKit
    9. class PaymentsOnceTVCell: UITableViewCell, UITextFieldDelegate {
    10. @IBOutlet weak var LabelPaymentsOnce: UILabel!
    11. @IBOutlet weak var TextPaymentsOnce: UITextField!
    12. var CashTextField: CashTextField!
    13. override func awakeFromNib() {
    14. super.awakeFromNib()
    15. TextPaymentsOnce.delegate = self
    16. //Ich vermute, daß hier noch etwas Code fehlt, nur was schreibe ich da rein, damit das klappt????
    17. // Initialization code
    18. }
    19. override func setSelected(_ selected: Bool, animated: Bool) {
    20. super.setSelected(selected, animated: animated)
    21. // Configure the view for the selected state
    22. }
    23. // Methods or Functions
    24. }
    Alles anzeigen
    Nun meine Fragen:

    1. Xcode meckert in meiner Design Datei, daß
    - Instance member 'resignFirstResponder' cannot be used on type 'CashTextField'; did you mean to use a value of this type instead? (Zeile 26)
    - Use of unresolved identifier 'amt' (Zeilen 31 und 35)
    - Instance member 'text' cannot be used on type 'CashTextField' (Zeilen 32 und 36)

    Kommen die Fehler dadurch zustande, daß ich hier kein IBOutlet verwende und wie löse ich das Problem? Denn ich kann ja keinen universellen IBOutlet für meine ganzen TableViewCells schreiben.

    2. Wie verbinde ich die beiden Dateien richtig?

    3. sind sonst noch Fehler im Code oder bei meiner Denkweise drin?

    Vielen Dank schon mal für die Unterstützung!

    Gruß mac
  • Die 'fehlerhafte' Codezeile inline markiert:

    Bertone105 schrieb:

    Quellcode

    1. //
    2. // DesignFile.swift
    3. // Life Simulator
    4. //
    5. // Created by Bertone 105 on 11.05.18.
    6. // Copyright © 2018 Bertone 105. All rights reserved.
    7. //
    8. import Foundation
    9. import UIKit
    10. class CashTextField: UITableViewCell, UITextFieldDelegate {
    11. var CashTextField: UITextField!
    12. var amt: Int = 0
    13. func shape() {
    14. CashTextField.delegate = self
    15. CashTextField.placeholder = updateAmount()
    16. // Initialization code
    17. self.CashTextField.layer.borderColor = UIColor(red: 200/255, green: 200/255, blue: 200/255, alpha: 1).cgColor
    18. self.CashTextField.layer.borderWidth = CGFloat(Float(1.0));
    19. }
    20. } // <--- Die Klassendefinition endet hier etwas voreilig ;-)
    21. // Methods or Functions
    22. func hideKeyboard() {
    23. CashTextField.resignFirstResponder()
    24. }
    25. func textField(_ _textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    26. if let digit = Int(string) {
    27. amt = amt * 10 + digit
    28. CashTextField.text = updateAmount()
    29. }
    30. if string == "" {
    31. amt = amt/10
    32. CashTextField.text = updateAmount()
    33. }
    34. return false
    35. }
    36. func updateAmount() -> String? {
    37. let formatter = NumberFormatter()
    38. formatter.numberStyle = NumberFormatter.Style.currency
    39. let amount = Double(amt/100) + Double(amt%100)/100
    40. return formatter.string(from: NSNumber(value: amount))
    41. }
    42. // Display will go back when clicking return
    43. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    44. CashTextField.resignFirstResponder()
    45. return true
    46. }
    Alles anzeigen
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • matz schrieb:

    Du hast Vererbung entweder nicht verstanden oder willst es hier nicht anwenden. Lies es dir noch mal in Ruhe durch und versuch es an einem anderen Beispiel unzusetzen.
    Könnte sein, daß ich es nicht verstanden hab, aber warum bist du der Meinung? Vlt. brauche ich in meinem Fall nicht Vererbung sondern etwas Anderes.
    Oder würdest du den oben dargestellten Code in jede meiner TVCells schreiben?

    Ich muß auch ehrlich sagen, daß ich mit den ganzen Hunde und Autobeispielen im Web und bei Apple nichts anfangen kann. Darüber hinaus hab ich nirgends etwas dazu gefunden, wie ich zwei Dateien miteinander verbinde (einfach gesprochen). Für mich ist es am leichtesten zu verstehen, wenn ich ein Codebeispiel sehe, das zu meinem Problem passt. Da ich das nicht gefunden hab, bin ich diesen Weg gegangen.

    @torquato, danke für den Hinweis! Hast auch noch ne Lösung zu Frage 2, also was muß ich in die zweite Datei schreiben?
  • Bertone105 schrieb:

    Darüber hinaus hab ich nirgends etwas dazu gefunden, wie ich zwei Dateien miteinander verbinde (einfach gesprochen).
    Ich finde die Art in Dateien und nicht in Klassen zu denken bei OOP schon sehr seltsam. Klar sollte man für jede Klasse eine eigene Datei verwenden, aber man kann 2 oder mehr Klassen auch in einer Datei definieren.

    Das Problem sollte also nicht sein, wie Du zwei Dateien miteinander verbindest, sondern wie Du 2 Klassen miteinander verbindest. Das Stichworte dazu heissen, wie von den anderen und mir schon erwähnt, Basisklasse und Vererbung.

    Also alles was gleich ist und mehrfach verwendet werden soll kommt in eine Basisklasse und die Klassen, welche dann die gleiche Funktionalität verwenden sollen, "erben" von dieser Basisklasse bzw. sind von der Basisklasse abgeleitet.

    Bezogen auf Dein Beispiel muss PaymentsOnceTVCell nicht von UITableViewCell, sondern einfach von CashTextField abgeleitet werden. ;)
  • @MCDan das würde ja aber bedeuten, daß ich den Code in einer Swift Datei habe, ihn oben einmal ausführlich schreibe und dann unten immer wieder mich auf diesen beziehe.
    Ich habe jedoch für jede Scene eine ViewController Datei angelegt. Da jede Scene bei mir eine TableViewCell beinhaltet, habe ich auch noch dafür je eine TableViewCellViewController Datei angelegt.

    Das bedeutet, ich habe den oben genannten Code in 10 Swift Dateien stehen und kann jedes Mal bei allen den Code anpassen, wenn sich was ändert. Mag ja sein, daß ich schon hier beim Aufbau einen Denkfehler habe, doch leider hab ich noch nirgends eine Anleitung bez. des optimalen Aufbaus einer komplexen App gefunden. Was ich ehrlich gesagt sehr gerne mal lesen würde.

    Wie würdet Ihr das denn angehen? Eine TableViewCellViewController Datei für alle zusammen?
  • Schau doch mal hier checkportale.de/swift-grundlag…ner-weiteren-swift-reihe/ oder hier youtube.com/watch?v=C9dmCL52lZI. Dies sind übrigens die ersten beiden Treffer für die Google Suche "swift vererbung". ;)

    Diese Tutorials/Erklärungen sind allerdings sehr allgemein und kein Beispiel für die Vererbung bei ViewControllern oder TableViewCells. Das Prinzip sollte damit allerdings klarer werden und sich auf Deinen Anwendungsfall übertragen lassen.

    Wenn Deine TableViewCells in den verschiedenen TableViews alle identisch aussehen und funktionieren, dann kannst Du für alle TableViews auch die gleiche Klasse für die TableViewCells verwenden.