2016-08-04 28 views
1

Ich entwickle eine einfache hybride iOS App mit Xcode 7 und Swift 2. Ich muss Untermenüs aus meinem Hauptmenü erstellen.Swift - Verwenden von UITableViewController zum Erstellen von Untermenüs

Mein Hauptmenü verwendet eine Tabellenansicht. Jetzt kann ich ein zweites UITableViewController erstellen und das Untermenü darin laden und ein drittes UITableViewController erstellen, um ein anderes Untermenü zu laden und so weiter.

Aber gibt es einen besseren Weg durch die Wiederverwendung meiner ursprünglichen UITableViewController?

UITableViewController ist in eine UINavigationController eingebettet.

Und ich verwende eine einzige UIViewController, um die endgültigen Textinformationen anzuzeigen.

enter image description here

Hier ist mein Hauptmenü Code:

Klasse MainMenuTableViewController: UITableViewController {

// MARK: Properties 

var mainMenu = [MainMenu]() 
var Item1Menu = [MainMenu]() 
var Item12Menu = [MainMenu]() 
var selectedMenu: Int = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Load the sample data. 
    loadMainMenu() 
    loadItem1Menu() 
    loadItem12Menu() 

} 

func loadMainMenu() { 
    let image1 = UIImage(named: "menu-1")! 
    let menuItem1 = MainMenu(name: "Item 1", photo: image1, url: "no-url", urlType: "subMenu")! 

    let image2 = UIImage(named: "menu-2")! 
    let menuItem2 = MainMenu(name: "Item 2", photo: image2, url: "our-services", urlType: "localURL")! 

    let image3 = UIImage(named: "menu-3")! 
    let menuItem3 = MainMenu(name: "Item 3", photo: image3, url: "http://www.google.com", urlType: "webURL")! 

    let image4 = UIImage(named: "menu-1")! 
    let menuItem4 = MainMenu(name: "Item 4", photo: image4, url: "our-info", urlType: "localURL")! 

    let image5 = UIImage(named: "menu-2")! 
    let menuItem5 = MainMenu(name: "Item 5", photo: image5, url: "http://www.bing.com", urlType: "webURL")! 

    //mainMenu.removeAll() 
    mainMenu += [menuItem1, menuItem2, menuItem3, menuItem4, menuItem5] 
} 

func loadItem1Menu() { 
    let image = UIImage(named: "menu-1")! 
    let menuItem1 = MainMenu(name: "Item 1.1", photo: image, url: "our-profile", urlType: "localURL")! 

    let menuItem2 = MainMenu(name: "Item 1.2", photo: image, url: "no-url", urlType: "sub-menu")! 

    let menuItem3 = MainMenu(name: "Item 1.3", photo: image, url: "our-history", urlType: "localURL")! 

    //mainMenu.removeAll() 
    Item1Menu += [menuItem1, menuItem2, menuItem3] 
} 

func loadItem12Menu() { 
    let image = UIImage(named: "menu-1")! 
    let menuItem1 = MainMenu(name: "Item 1.2.1", photo: image, url: "portfolio-1", urlType: "localURL")! 

    let menuItem2 = MainMenu(name: "Item 1.2.2", photo: image, url: "portfolio-2", urlType: "localURL")! 

    let menuItem3 = MainMenu(name: "Item 1.2.3", photo: image, url: "portfolio-3", urlType: "localURL")! 

    //mainMenu.removeAll() 
    Item12Menu += [menuItem1, menuItem2, menuItem3] 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return mainMenu.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    // Table view cells are reused and should be dequeued using a cell identifier. 
    let cellIdentifier = "MainMenuTableViewCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MainMenuTableViewCell 

    // Fetches the appropriate menu for the data source layout. 
    let menu = mainMenu[indexPath.row] 

    cell.nameLabel.text = menu.name 
    cell.menuImageView.image = menu.photo 

    return cell 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    var segueString:String 
    selectedMenu = indexPath.row 
    let urlType = mainMenu[selectedMenu].urlType 

    if urlType == "subMenu" { 

     //http://stackoverflow.com/a/38763630/1019454 
     let vc = (UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())).instantiateViewControllerWithIdentifier("MenuViewController") as! MainMenuTableViewController 

     vc.mainMenu = Item1Menu 
     // then push or present view controller 
     self.navigationController!.pushViewController(vc, animated: true) 

    } else { 


     switch(mainMenu[selectedMenu].urlType){ 

     case "localURL": 
      segueString = "ShowLocalWeb" 
     default: 
      segueString = "ShowWeb" 
     } 

     self.performSegueWithIdentifier(segueString, sender: self) 
    } 
} 


// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    /* 
    if segue.identifier == "ShowSubMenu" { 
     let subMenuController = segue.destinationViewController as! SubMenuTableViewController 
     subMenuController.subMenu = mainMenu[selectedMenu] 
    }*/ 

    if segue.identifier == "ShowLocalWeb" { 
     let localViewController = segue.destinationViewController as! LocalWebViewController 
     localViewController.mainMenu = mainMenu[selectedMenu] 
    } 

    if segue.identifier == "ShowWeb" { 
     let webViewController = segue.destinationViewController as! WebViewController 
     webViewController.mainMenu = mainMenu[selectedMenu] 

    } 
} 

}

+0

Sie können denselben 'UITableViewController' verwenden, um Ihre Menüs anzuzeigen. Sie müssen Ihre Daten nur dynamisch pflegen. Können Sie Ihren Code speziell für 'delegate',' dataSource' und die Art und Weise zeigen, wie Sie die Daten verwenden/anzeigen? –

+0

Ich habe meine Frage mit dem Code aktualisiert. – Gaga

+0

Eigentlich sind Sie alle bereit zu gehen. Die einzige Änderung, die Sie brauchen, ist eine Instanz von 'MainMenuTableViewController' zu erstellen und 'mainMenu' mit Ihrem neuen Menü zuzuweisen. –

Antwort

1

Eigentlich sind Sie alle bereit zu gehen. Die einzige Änderung, die Sie benötigen, ist eine Instanz von MainMenuTableViewController erstellen und mainMenu mit Ihrem neuen Menü zuweisen.

Beispiel:

Wenn Sie neue Menü anzeigen möchten.

let vc = MainMenuTableViewController() 
vc.menu = <new menu here> 
// then push or present view controller 
self.navigationController.pushViewController(vc, animated: true) 

Antwort unten Kommentar:

Nein, Sie nicht neue Datei erstellen müssen, aber neue Instanz von MainMenuTableViewController. Sie müssen den Datenteil ändern, in Ihrem Fall-Array, das menu enthält. <new menu here> bezieht sich auf eine Reihe neuer Menüeinträge.

Dazu müssen Sie Decouple die Daten, die hilfreich sein werden.

Edit:

Statt der Erstellung Ihres vc in der obigen Art und Weise können Sie versuchen, es aus dem Storyboard zu schaffen. Bitte folgen Sie den Schritten:

  1. Im Storyboard assign Storyboard Kennung MainMenuTableViewController und statt dieser Linie

let vc = MainMenuTableViewController()

Verwendung

let vc = (UIStoryboard(name: <your storyboard file name>, bundle: NSBundle.mainBundle())).instantiateViewControllerWithIdentifier(<storyboard identifier of MainMainMenuTableViewController>) 

Der Grund, weshalb ich vermute, ist die Linie, die Ich bin vorher nicht in der Lage, Zelle zu finden, um zu verursachen und folglich zu crashen.

+0

Was meinst du mit neuer Speisekarte hier? Und was ist SecondViewController? Muss ich eine neue Datei erstellen? Wenn dies der Fall ist, wird der Zweck zunichte gemacht, da ich keinen neuen TableViewController für jede neue Drill-Down-Ebene erstellen möchte. – Gaga

+0

@almiteyG Pls siehe bearbeiten –

+0

Danke. Ich habe bereits ein neues Array und alles erstellt. Aber ich folge immer noch nicht dem, was secondViewController ist, daher mein erster Kommentar. MainMenuTableViewController.swift: 106: 59: Verwendung der nicht aufgelösten Bezeichner 'SecondViewController' – Gaga

0

Wenn Sie eine einfachste Lösung möchten Sie Ihre Datenquelle und Anruf wechseln sollte .reloadData() für die TableView.

Ob Sie tatsächlich ein paar Objekte haben, die das Datenquellenprotokoll implementieren und nur zwischen ihnen wechseln oder ein Array von Objekten als Datenquelle haben und nur den Inhalt dieses Arrays wechseln, ist Ihre Entscheidung und eher ein Styling/Architektur Ding.

+0

Ich benutze keine SammlungView – Gaga

+0

richtig, meine schlechte, Tabellenansicht, aber es ist alles gleich –

+0

so sollte ich '.reloadData()' in meinem 'viewDidLoad()'? – Gaga

0

Wenn mein Verständnis der Frage richtig ist, schätze ich, dass Sie ein Hauptmenü haben und Untermenüs darunter anzeigen möchten.

Eine Möglichkeit besteht darin, Zeilen einzufügen und zu löschen. Auf diese Weise können Sie denselben UITableViewController einfach wiederverwenden. Wenn Sie also auf Punkt 2 klicken, können Sie eine Reihe von Zeilen in die tabellarische Ansicht des Index einfügen, der mit den Daten Ihres Untermenüs gefüllt ist.

können Sie die Funktionen insertRowsAtIndexPaths verwenden (: withRowAnimation :) und DeleteRowsAtIndexPaths (: withRowAnimation :) innerhalb eines Blocks des Anrufs zu tableView.beginUpdates() und tableView.endUpdates() und aktualisieren Sie die Tableview Datasource dies zu erreichen.

Hoffe, das hilft.

+0

Dies scheint wie etwas, das ich versuchen könnte. Was passiert, wenn ich zurückschleiche? Wird es automatisch erledigt oder muss ich feststellen, in welchem ​​Menü ich vorher war und das nochmal einfügen? Ich werde es versuchen und sehen, wie es funktioniert. Mein Hauptziel ist es zu vermeiden, mehrere 'UITableViewController' – Gaga

+0

zu verwenden. Es wird von selbst behandelt werden. Sie müssen nur sicherstellen, dass Ihre Datenquelle beim Löschen und Hinzufügen von Zeilen korrekt gehandhabt wird. Lassen Sie mich wissen, wenn Sie weitere Hilfe mit dem Code-Teil benötigen. – anaghaajith27

+0

Danke @ anaghaajith27. Aber ich fand Vivek Molkar einfacher zu beantworten, da ich nur 3-4 Zeilen Code hinzufügen musste. Das Erstellen einer Instanz war tatsächlich viel einfacher, ich habe einfach nicht verstanden, wie man es vom Storyboard aus macht. – Gaga