2017-02-28 3 views
0

Ich versuche, mein erstes iOS-Projekt zu erstellen. Ich habe recht gute Erfahrungen mit C# gemacht. Ich erhalte Daten mit Kategorien und Artikeln. Aber ich weiß nicht, wie viele Unterkategorien ich bekommen werde, bevor die Artikel aufgelistet werden. Das Durchsuchen der Unterkategorien sollte über TableView erfolgen. Wenn ein Benutzer auf eine Kategorie klickt, sollten die Unterkategorien (Ebene 1) in einer Tabelle angezeigt werden. Nach dem Berühren einer Unterkategorie sollten dann die Unterkategorien (Ebene 2) der Gegenwart angezeigt werden (und so weiter). Wenn es keine weiteren Unterkategorien mehr gibt, sollte die Artikelliste angezeigt werden. Nach dem Berühren eines Artikels sollte ein neuer ViewController mit den Artikeldaten angezeigt werden.Dynamisch navigieren durch n Kategorien

Meine Frage ist, wie man mit der Navigation durch die Unterkategorien umgehen und Übergänge oder etw. Erstellen kann. so wie das. Ich weiß, dass ich dafür kein Storyboard verwenden kann, da ich die Anzahl der Unterkategorien nicht kenne und sie sich auch unterscheiden.

Wie kann ich diese dynamische Navigation erreichen? Kannst du mir ein Beispiel geben? Ich weiß, wie man Daten in das TableView einträgt. Nur die dynamische Navigation ist das Problem.

+0

Was ist mit dem Definieren von Kategorien und Artikeln in der Datenbank, und holen Sie sie während der Laufzeit? – Zbidi

+0

Ich erhalte diese Daten über eine API über WAN/LAN. Aber die Daten zu bekommen, ist nicht das Problem. Ich weiß nicht, wie man den tableviewcontroller mit n subcategory-levels und einer abschließenden Artikelebene programmatisch wiederverwenden kann. Das dachte ich mir im Konzept so: Daten in Tabelle anzeigen. Berühren Sie -> Unterkategorien anzeigen, Ebene 1 mit dieser Tabelle (und Navigationsstapel) wiederverwenden -> berühren -> anzeigen -> berühren -> anzeigen .... zuletzt Artikelliste anzeigen -> berühren -> UIViewController mit Artikeldetails laden. Wie mache ich das über Code? Ist das der richtige Weg? Ich hoffe du verstehst. – MikeRoss

Antwort

0

Ich habe jetzt eine Lösung. Kann jemand bitte überprüfen, ob ich es richtig mache, nicht dass ich Programmierungsmuster oder Richtlinien nicht verletze.

Kurz gesagt: In der TableSource-Klasse greife ich auf das Storyboard zu und erzeuge und zeige dynamisch denselben Controller, der auch tatsächlich dargestellt wird. Aber bevor ich das neue vorstelle, erkläre ich eine andere Quellklasse. Damit das TableView zur Anzeige von Adressbüchern und Adresskarten verwendet wird, wird der UIViewController zur Anzeige der Kartendaten verwendet. Diese beiden Controller sind über einen Strang verbunden.

Hier sind mein Controller und beide Quelle-Classes:

AddressbooksController.cs

public AddressbooksController (IntPtr handle) : base (handle) 
    { 
     displayModel = "addressbooks"; 
    } 

    private void loadAddressbooks() 
    { 
     var AppDelegate = UIApplication.SharedApplication.Delegate as AppDelegate; 
     addressbooks = AppDelegate.api.DeserializeEntities<YAddressbook>(Task.Run(async() => await AppDelegate.api.Get("Yaddressbooks")).Result); 
    } 

    public void loadAddresscards() 
    { 
     var AppDelegate = UIApplication.SharedApplication.Delegate as AppDelegate; 
     addresscards = AppDelegate.api.DeserializeEntities<Ycard>(Task.Run(async() => await AppDelegate.api.Get("Ycards")).Result); 
    } 

    public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) 
    { 
     base.PrepareForSegue(segue, sender); 

     // do first a control on the Identifier for your segu 
     if (segue.Identifier.Equals("segueShowAddress")) 
     { 

      var viewController = (AddresscardController)segue.DestinationViewController; 
      viewController.card = Card2Display; 
     } 
    } 

    public override void ViewDidLoad() 
    { 
     if (displayModel == "addressbooks") 
     { 
      loadAddressbooks(); 
      tableView.Source = new AddressbooksTableSource(addressbooks.data, this); 
      this.NavigationController.Title = "Addressbücher"; 
     } 
     else if (displayModel == "addresscards") 
     { 
      loadAddresscards(); 
      tableView.Source = new AddresscardsTableSource(addresscards.data, this); 
      this.NavigationController. 
     } 

     base.ViewDidLoad(); 
    } 

AddressbooksTableSource

public class AddressbooksTableSource: UITableViewSource 
{ 

    private List<YAddressbook> addressbooks; 
    private string cellIdentifier = "AddressbooksCell"; 
    private UINavigationController navigationController; 


    public AddressbooksTableSource(List<YAddressbook> books, AddressbooksController ab) 
    { 
     addressbooks = books; 
     this.navigationController = ab.ParentViewController as UINavigationController; 
     Console.WriteLine(ab.displayModel); 
    } 

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
    { 
     Console.WriteLine("Row selected" + addressbooks[indexPath.Row].displayname); 
     UIStoryboard Storyboard = UIStoryboard.FromName("Main", null); 

     AddressbooksController newab = Storyboard.InstantiateViewController("AddressbooksViewController") as AddressbooksController; 
     newab.displayModel = "addresscards"; 
     navigationController.PushViewController(newab, true); 

     tableView.DeselectRow(indexPath, true); 
    } 


    .... 
} 

AddresscardsTableSource

public class AddresscardsTableSource: UITableViewSource 
{ 
    private List<Ycard> addresscards; 
    UINavigationController navigationController; 
    AddressbooksController ab; 
    string cellIdentifier = "AddresscardCell"; 

    public AddresscardsTableSource(List<Ycard> cards, AddressbooksController vc) 
    { 
     addresscards = cards; 
     navigationController = vc.ParentViewController as UINavigationController; 
     ab = vc; 
     //navigationController = tableview; 
    } 

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
    { 
     Console.WriteLine("Row selected" + addresscards[indexPath.Row].carddata); 
     //UIStoryboard Storyboard = UIStoryboard.FromName("Main", null); 

     ab.Card2Display = addresscards[indexPath.Row]; 
     ab.PerformSegue("segueShowAddress", indexPath); 

     //AddresscardController ab = Storyboard.InstantiateViewController("AddresscardViewController") as AddressbooksController; 
     //ab.TableView.Source = this; 
     //navigationController.PushViewController(ab, true); 

     tableView.DeselectRow(indexPath, true); 
    } 

    ..... 

} 

Es funktioniert. Aber mache ich es richtig? Danke

+0

Jeder? Ist das richtig? – MikeRoss

Verwandte Themen