SplitViewController, ändere Text wenn DetailView ausgewählt wurde

  • SplitViewController, ändere Text wenn DetailView ausgewählt wurde

    Hallo, ich bin es mal wieder ?( :whistling:

    ich habe ein SplitViewController mit bis zu 7 Verknüpfungen zum Master. Das anzeigen der einzelnen und Unterschiedlichen Views habe ich geschafft.(Das ist nebensächlich xD)
    Ich fülle das View so:

    C-Quellcode

    1. override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    2. let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    3. // Configure the cell...
    4. cell.textLabel?.text = String(Listenpunkte[indexPath.row])
    5. return cell
    6. }

    Somit ist die Liste des Master gefüllt.
    Wenn ich jetzt ein DetailView öffne und darin auf ein Button klicke möchte ich das ein String vom DetailView im Master was anpasst zum Beispiel den Text in der Zelle.
    Ich weiß leider keinen Anhaltspunkt wie ich das machen könnte.
    Zum Beispiel habe ich auf einem DetailView eine weitere Tabelle und wenn ich diese Funktion ausführe:

    C-Quellcode

    1. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    2. stringValue = String(tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text!)
    3. // Nun soll die stringValue an das MasterView übergeben werden und die ausgewählte Spalte soll angepasst werden.
    4. // Sprich: wenn die Zeile Mitarbeiter heißt soll sie ergänzt werden durch stringValue...
    5. }
    Ich hoffe jemand kann mir bei meinem Problem weiter helfen.

    LG
    :evil: Catch me if u can :evil:
  • Styler_05 schrieb:

    Hallo, ich bin es mal wieder ?( :whistling:

    ich habe ein SplitViewController mit bis zu 7 Verknüpfungen zum Master. Das anzeigen der einzelnen und Unterschiedlichen Views habe ich geschafft.(Das ist nebensächlich xD)
    Ich fülle das View so:

    C-Quellcode

    1. override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    2. let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    3. // Configure the cell...
    4. cell.textLabel?.text = String(Listenpunkte[indexPath.row])
    5. return cell
    6. }
    Somit ist die Liste des Master gefüllt.
    Wenn ich jetzt ein DetailView öffne und darin auf ein Button klicke möchte ich das ein String vom DetailView im Master was anpasst zum Beispiel den Text in der Zelle.
    Ich weiß leider keinen Anhaltspunkt wie ich das machen könnte.
    Zum Beispiel habe ich auf einem DetailView eine weitere Tabelle und wenn ich diese Funktion ausführe:

    C-Quellcode

    1. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    2. stringValue = String(tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text!)
    3. // Nun soll die stringValue an das MasterView übergeben werden und die ausgewählte Spalte soll angepasst werden.
    4. // Sprich: wenn die Zeile Mitarbeiter heißt soll sie ergänzt werden durch stringValue...
    5. }
    Ich hoffe jemand kann mir bei meinem Problem weiter helfen.

    LG
    Ich denke mit die einfachste Variante da szu lösen wäre, dass du dein Array Listenpunkte mit dem DetailViewController teilst, dort den entsprechenden Eintrag bearbeitest und dann den Master View Controller aktualisierst...
  • Styler_05 schrieb:

    Hola DanielBocksteger95

    das hört sich nach einem Plan an :)
    Wie kann ich den über DetailViewController auf das Array Listenpunkt zugreifen(oder teilen) ?
    Und Wie kann ich so ein update(aktualisieren) auf das MasterView anwenden?

    Liebe Grüße
    @MCDan hat da schon einige gute Ansätze geliefert. gibt es mit ein bisschen suche auch entsprechende Swift Artikel zu.

    Der sicherlich schnellste Weg das ganze zu implementieren wäre, dass du im detailViewController ein Propery (NSArray) anlegst, wo du deine Listenpunkte hin weitergibst. So hat dann auch dieser auf die Einträge zugriff und du kannst sie verändern. Eine andere Alternative wäre, dass du dem detailViewControlelr immer nur den gerade aktiven Eintrag (String) weitergibst, diesen veränderst und dann ebenfalls die Liste neulädst.

    Danach musst du nur noch im detailViewController zusehen, dass du an deinen MasterViewController kommst und dort ein reloadData aufs TableView abfeuern.
  • Die Übergabe eines String Objektes an den DetailViewController dürfte nicht viel bringen. In Objective-C sind String Objekte immutable, also unveränderlich. Ich tippe jetzt einfach mal, dass dies in Swift auch so ist. Eine Änderung an dem String Objekt wirst Du im MasterViewController somit nicht bemerken, da es beim Ändern zu einem neuen Objekt kommt.
  • MCDan schrieb:

    In Objective-C sind String Objekte immutable, also unveränderlich. Ich tippe jetzt einfach mal, dass dies in Swift auch so ist.

    Strings sind in Swift in Abhängigkeit von var und let veränderlich oder eben nicht.
    Wobei ein mutabler unveränderlicher String (frag nicht…) ersetzt wird wohingegen ein immutabler veränderlicher String (echt jetzt…) nur 'hinten rum' verändert werden kann.

    Quellcode

    1. //: Playground - noun: a place where people can play
    2. import Cocoa
    3. import Foundation
    4. let immutable:NSString = "Unveränderlich" as NSString
    5. var mutable:NSMutableString = "Veränderlich" as NSMutableString
    6. let immutableMutable:NSMutableString = "Was bin ich?" as NSMutableString
    7. var mutableImmutable:NSString = "Was bin ich?" as NSString
    8. let immutableString = "Unveränderlich"
    9. var mutableString = "Veränderlich"
    10. immutable = "Geht nicht" //Cannot assign to value: 'immutable' is a 'let' constant
    11. mutable = "Wird (vermutlich) ersetzt." // "Wird (vermutlich) ersetzt."
    12. immutableMutable = "Geht auch nicht" //Cannot assign to value: 'immutableMutable' is a 'let' constant
    13. mutableImmutable = "Wird (hoffentlich) ebenfalls ersetzt." //"Wird (hoffentlich) ebenfalls ersetzt."
    14. immutableString = "Geht ebenfalls nicht" ////Cannot assign to value: 'immutableString' is a 'let' constant
    15. mutableString = "Geht selbstverständlich." //"Geht selbstverständlich."
    16. mutable.appendString(" Liegt nahe.") //"Wird (vermutlich) ebenfalls ersetzt. Liegt nahe."
    17. immutableMutable.appendString(" Oder wer?") //"Was bin ich? Oder wer?"
    18. mutableString.appendContentsOf(" Was denkst Duden?") //"Geht selbstverständlich. Was denkst Duden?"
    Alles anzeigen

    Alles klar soweit? ^^
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Hallo alle zusammen,
    danke für die Nachrichten, habe mich weiter erkundigt und habe dazu diese nette Anweisung gefunden: makeapppie.com/2015/03/12/swif…e-master-detail-template/
    Der macht zwar nicht genau das wie ich das will, aber ich kann es ja umbauen :)
    Doch nachdem ich den Code in meine Umgebung angepasst habe kommt bei mir die Fehlermeldung: exc_bad_instruction (code=exc_i386_invop subcode=0x0)
    Hier mal mein Mastreview:

    C-Quellcode

    1. class MasterViewController: UITableViewController, MitarbeiterDelegate {
    2. var Listenpunkte = [String]()
    3. var MitarbeiterController: Mitarbeiter? = nil
    4. @IBOutlet var tbl_View: UITableView!
    5. override func viewDidLoad() {
    6. super.viewDidLoad()
    7. // Habe ich etwas umgebaut, weil es bei mir zu einer Fehlermeldung kam!
    8. self.MitarbeiterController?.delegate = self
    9. }
    10. func didSelectMitarbeiter(newMitarbeiter: String) {
    11. Listenpunkte.append(newMitarbeiter)
    12. tableView.reloadData()
    13. }
    14. }
    Alles anzeigen
    Hier mal Detail:

    C-Quellcode

    1. protocol MitarbeiterDelegate{
    2. func didSelectMitarbeiter(newMitarbeiter:String)
    3. }
    4. class Mitarbeiter: UIViewController {
    5. var delegate:MitarbeiterDelegate! = nil
    6. @IBOutlet weak var tbl_Mitarbeiter: UITableView!
    7. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    8. let selectedMitarbeiter = String(tbl_Mitarbeiter.cellForRowAtIndexPath(indexPath)!.textLabel!.text!)
    9. delegate.didSelectMitarbeiter(selectedMitarbeiter) //Hier kommt die Fehlermeldung
    10. }
    11. }
    Alles anzeigen
    Im Code habe ich die stelle markiert wo es zu der Fehlermeldung kommt.


    Ich habe es wie bei dem Tutorial gemacht aber bei mir macht der das nicht....

    Kann mir jmd helfen?

    LG
    :evil: Catch me if u can :evil:
  • Styler_05 schrieb:

    Ich habe es wie bei dem Tutorial gemacht aber bei mir macht der das nicht....
    Dann hast Du irgendwas falsch gemacht.
    Mutmaßlich kein Verständnis für das gehabt, was Du da getan hast…
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Hallo matz,

    da hast du recht xD im tutorial benutzt er diesen code dafür

    C-Quellcode

    1. if let split = self.splitViewController {
    2. let controllers = split.viewControllers
    3. self.detailViewController =
    4. controllers[controllers.count-1].topViewController
    5. as? MenuTableViewController
    6. }
    doch wenn ich den bei mir benutze kommt die Fehlermeldung Value of type 'UIViewController' has no member 'topViewController' hinter dem self ...
    keine Ahnung warum das bei Ihm geht sicherlich liegt es an Swift1.2 und Swift 2.0

    Hallo Marco Feltmann,
    da hast du recht, habe wohl falsch gemacht ...
    :evil: Catch me if u can :evil:
  • Styler_05 schrieb:

    doch wenn ich den bei mir benutze kommt die Fehlermeldung Value of type 'UIViewController' has no member 'topViewController' hinter dem self ...
    keine Ahnung warum das bei Ihm geht sicherlich liegt es an Swift1.2 und Swift 2.0
    Nein, das liegt daran, dass UIViewController keinen Member 'topViewController' kennt.
    Im Tutorial ist das garantiert ein UINavigationViewController und kein UIViewController.

    Echt jetzt, arbeite Dich lieber durch das offizielle Einstiegstutorial durch statt Dir ohne irgendwelches Hintergrundwissen an Hand irgendwelcher Tutorials irgendwas zusammenzuklöppeln.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Naja, so ähnlich steht's schon im Template…
    [controller lastObject].topViewController

    Was allerdings bei der (count-1) Variante passiert, wenn controller = @[]; ist schon spannend. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P