Dein gleichen View mehrmals hintereinander benutzen?

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

  • Dein gleichen View mehrmals hintereinander benutzen?

    Hallo,

    ich teste mich gerade durch eine kleine App, die einen Abschnitt enthält, in der man "Karten", ähnlich Karteikarten (CardAddViewController) mit diversen Inhalten anlegen kann.
    Rein vom Layout her, dachte ich, dass ich am Ende zwei Buttons einfüge mit 1x "speichern, weitere Karte einfügen" und 1x "speichern und fertig".

    Bei "speichern, weitere Karte einfügen" würde ich am liebsten nach dem eigentlichen Speichern der eingegeben Werte, den View neu laden und so tun, als hätte ich ihn zum ersten Mal geladen. Auf diesen Wege kann ich ihn unendlich weiter benutzen bis ich eben "speichern und fertig" auswähle.
    Gibt es so eine Möglichkeit?

    Danke und schönes WE!!
  • Vielleicht fehlt mir dazu noch die Erfahrung, aber wenn ich "speichern" klicke, lande ich ja in genau der dafür vorgesehenen Speichern Methode...

    Ähnlich wie im Browser würde ich an dieser Stelle (genauer nach dem erfolgreichen Speichern) gerne einen Reload ausführen, damit ich wieder in meinen Methoden ViewDidApear und ViewDidLoad() lande...

    Damit müsste ich keine Felder leeren etc...
    Sondern fange quasi von vorne an...

    Und genau da steckt meine Frage: Geht das? Und wenn ja, wie genau?
  • macmoonshine schrieb:

    Meinst du View oder Viewcontroller? Das geht bei beidem; Viewcontroller kannst du beispielsweise über eine starke Referenz halten und beliebig oft anzeigen.



    Ich meine den ViewController.
    Könntest Du mir das noch ein bisschen detaillierter erklären?
    Was ist eine starke Referenz? Oder wie nennt sich das auf english, dann kann ich danach googeln?
  • heohni schrieb:

    Und wenn ja, wie genau?

    Quellcode

    1. ​@interface CardsController()
    2. @property (nonatomic, strong) CardViewController *cardController;
    3. @end
    4. @implementation CardsController
    5. - (void)viewDidLoad {
    6. [super viewDidLoad];
    7. self.cardController = [self.storyboard instantiateViewControllerWithIdentifier:@"cardController"];
    8. }
    9. - (IBAction)showCardController {
    10. // Werte an Card-Controller übergeben
    11. [self.navigationController pushViewController:self.cardController animated:YES];
    12. }
    13. @end
    Alles anzeigen
    „Meine Komplikation hatte eine Komplikation.“
  • OK, ich glaube, damit komme ich voran, ich werde es testen! Danke!!



    Quellcode

    1. import UIKit
    2. import Parse
    3. class CardAddViewController: UIViewController {
    4. var cardController: AnyObject?
    5. override func viewDidLoad() {
    6. super.viewDidLoad()
    7. self.cardController = self.storyboard?.instantiateViewControllerWithIdentifier("CardAddViewController")
    8. }
    9. @IBAction func saveAndReload(sender: AnyObject) {
    10. self.navigationController?.pushViewController(self.cardController, animated: true) <-- hier erhalte ich die Fehlermeldung: [b]Cannot convert the expression's type '$T8??' to type Void[/b]
    11. }
    12. }
    Alles anzeigen


    Ich bin noch nicht ganz textsicher, was bedeutet dieser Fehler und wie kann ich ihn beheben? Was hab ich falsch gemacht?
    Schönes Wochenende Euch allen!!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von heohni ()

  • Servus

    Der Fehler ist recht einfach zu beheben.
    Was hier passiert ist du versuchst eine Objekt von der Klasse AnyObject mittels navigationcontroller darzustellen
    AnyObject ist die absolute Basis Klasse was bedeute jede Klasse erbt von dieser. Somit ist diese sehr rudimentär.
    Du versuchst hier deinem NavigationController zu sagen dass er ein AnyObject pushen soll, was in die Hose geht da die Methode nichts mit einem Object von der Klasse AnyObject machen kann.
    Die Methode erwartet ein Object von einer Klasse die zumindest von UIViewController abgeleitet ist.

    Die Lösung
    Dein cardController muss ein Object von der klasse CardAddController sein. Dann kannst du diesen auch pushen.
    Und natürlich beim Erstellen das das zu einem CardAddController passen sonst meckert der compiler da die Methode dir einen UIViewController zurückliefert
    Dude

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Dude ()

  • Das der Viewcontroller, auf den cardController verweist, die gleiche Klasse hat, zu der das Attribut gehört, macht keinen Sinn. Wenn ich deine Anforderung richtig verstanden habe, willst du ein typisches Master-Detail-Szenario. Also sollte sich cardController in der Viewcontroller-Klasse befinden, die alle Karten verwalten (siehe mein Beispiel oben / Card vs. Cards).
    „Meine Komplikation hatte eine Komplikation.“
  • Du erzeugst in einem CardAddViewController einen CardAddViewController. Was soll das für einen Sinn machen?

    Du willst ein klassisches Master-Detail-Interface (developer.apple.com/library/ma…s/Tasks/masterdetail.html), dabei stellt der Master die vorhandenen Entitäten (= Karten) dar, und der Detail-Controller zeigt ein einzelne Entität genauer an und erlaubt deren Bearbeitung. Diesem Muster begegnest du unter OSX und iOS auf Schritt und Tritt.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Du erzeugst in einem CardAddViewController einen CardAddViewController. Was soll das für einen Sinn machen?


    Ich hab versucht Deinem Beispiel zu folgen, bzw. versucht es zu verstehen, was Du damit erreichen willst.
    Leider bin ich noch kein Stück damit weiter, ich geb ja gerne zu, das ich doch noch sehr unsicher bin... das ist meine erste App überhaupt...
    Aber ich geb nicht auf, ich will es ja verstehen :)
  • heohni schrieb:

    Ich hab versucht Deinem Beispiel zu folgen, bzw. versucht es zu verstehen, was Du damit erreichen willst.

    Ich verwende in meinem Beispiel aber zwei Viewcontroller-Klassen: CardsController (Master) und CardViewController (Detail). Du verwendest hingegen nur CardAddViewController (Detail).

    Vielleicht wäre es für dich sinnvoller, wenn du dich erstmal mit diesem Unterschied beschäftigst, anstatt dich um eine Optimierung (Viewcontroller mehrmals benutzen) zu kümmern.
    „Meine Komplikation hatte eine Komplikation.“
  • Will mal versuchen es etwas genauer zu beschreiben

    Ich würde einen (Table)ViewController (CradsController) erstellen, in diesem wird in einer Tabelle alle Karten anzeigt. (= Master)
    Dann bietest du noch einen ViewController(CardViewController) an. (=Detail)
    In diesem kannst du dann deine beiden Buttons "Speichern und Fertig" und "Speichern und weitere einfügen" anbieten.
    Wenn der User dann auf den "Speichern und weitere einfügen" Button drückt speicherst du dir das ab und leerst den CardViewController
    Drückt der User auf "Speichern und Fertig" - Button speichert du die Daten ebenfalls und lädst deinen (Table)ViewController.

    Hoffe das hilft dir etwas weiter!