2016-08-04 2 views
1

Xcode 7 및 Swift 2를 사용하여 간단한 하이브리드 iOS 앱을 개발하고 있습니다. 메인 메뉴에서 하위 메뉴를 만들어야합니다.Swift - UITableViewController를 사용하여 하위 메뉴 만들기

내 기본 메뉴는 테이블보기를 사용합니다. 이제는 두 번째 UITableViewController을 만들고 그 안에 하위 메뉴를로드하고 세 번째 UITableViewController을 만들어 다른 하위 메뉴를로드하는 등의 작업을 수행 할 수 있습니다.

그러나 내 초기 UITableViewController을 재사용하면 더 좋은 방법이 있을까요?

UITableViewControllerUINavigationController에 내장되어 있습니다.

마지막으로 텍스트 정보를 표시하기 위해 UIViewController을 사용하고 있습니다.

클래스 MainMenuTableViewController : 여기

enter image description here

내 메인 메뉴 코드있는 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

동일한 'UITableViewController'를 사용하여 메뉴를 표시 할 수 있습니다. 데이터를 동적으로 유지해야합니다. 'delegate','dataSource' 및 데이터 사용/표시 방법에 대한 코드를 구체적으로 표시 할 수 있습니까? –

+0

코드로 내 질문을 업데이트했습니다. – Gaga

+0

사실 당신은 모두 갈 준비가되어 있습니다. 유일한 변경은'MainMenuTableViewController'의 인스턴스를 생성하고 새로운 메뉴로'mainMenu'를 할당하는 것입니다. –

답변

1

사실 당신은 모두 갈 준비가되어 있습니다. 유일한 변경 사항은 MainMenuTableViewController의 인스턴스를 만들고 새 메뉴에 mainMenu을 할당하는 것입니다.

예 :

새 메뉴를 표시하려고 할 때.

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

응답은 아래에 코멘트하기 :

아니, 당신은 새 파일을 만들 필요 없다, 그러나 MainMenuTableViewController의 새로운 인스턴스. 케이스 배열에서 menu을 포함하는 데이터 부분을 변경해야합니다. <new menu here>은 새 메뉴 항목의 배열을 나타냅니다.

여기에 도움이 될 데이터는 Decouple입니다.

편집 :

대신 작성하여 vc 위의 방식으로 스토리 보드에서 그것을 만드는 시도 할 수 있습니다. 단계를 따르십시오 : MainMenuTableViewController

  1. 스토리 보드 할당 스토리 보드 식별자를 대신이 라인의

let vc = MainMenuTableViewController()

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

내가 생각하는 이유 사용은 라인입니다 나는 이전에 셀을 만들어서 깨지는 것을 찾을 수 없다.

+0

여기에 새 메뉴가 무엇을 의미합니까? 그리고 secondViewController는 무엇입니까? 새 파일을 만들어야합니까? 그렇다면 모든 새로운 드릴 다운 레벨에 대해 새로운 TableViewController를 생성하고 싶지 않기 때문에 목적을 달성 할 수 없습니다. – Gaga

+0

@almiteyG Pls은 (는) 편집 –

+0

을 참조하십시오. 나는 이미 새로운 배열과 모든 것을 만들었습니다. 그러나 나는 아직도 secondViewController가 무엇인지 따르지 않는다. 그러므로 나의 첫 번째 코멘트이다. MainMenuTableViewController.swift : 106 : 59 : 확인되지 않은 식별자 'secondViewController'사용 – Gaga

0

당신은 당신이 당신의 데이터 소스와 통화를 전환해야 쉬운 솔루션을 원하는 경우 .reloadData()는 tableView에 있습니다.

실제로 데이터 소스 프로토콜을 구현하고 그 사이를 전환하거나 데이터 소스로 작동하는 객체 배열을 가지고이 어레이의 내용을 전환하는 것은 귀하의 결정이며 스타일링/아키텍처와 관련이 있습니다. 맡은 일.

+0

collectionview – Gaga

+0

, 내 나쁜, 테이블보기를 사용하지 않고 있지만 모두 동일합니다 –

+0

그래서'viewDidLoad()'에서'.reloadData()'를 사용해야합니까? – Gaga

0

질문에 대한 나의 이해가 옳다면, 메인 메뉴가 있고 그 밑에 서브 메뉴를 보여주고 싶습니다.

이렇게하는 한 가지 방법은 행을 삽입하고 삭제하는 것입니다. 이 방법을 사용하면 동일한 UITableViewController를 다시 사용할 수 있습니다. 따라서 항목 2를 클릭하면 하위 메뉴 데이터로 채워진 해당 인덱스의 행 집합이 tableView에 삽입 될 수 있습니다. tableView.beginUpdates()와 tableView.endUpdates에 호출 블록() 안에 withRowAnimation :) 이것을 달성하기 위해있는 tableView의 데이터 소스를 업데이트 withRowAnimation :)와 deleteRowsAtIndexPaths ( :

당신은 기능 insertRowsAtIndexPaths (를 사용할 수 있습니다.

희망이 도움이됩니다.

+0

이 보인다 내가 할 수있는 걸 좋아해. 내가 때렸을 때 어떻게 될까? 자동으로 처리 되나요? 아니면 이전에 어떤 메뉴에 있었는지 기록하고 다시 삽입해야합니까? 나는 그것을 시험해보고 그것이 어떻게 작동하는지 보게 될 것이다. 내 주요 목표는 여러 개의'UITableViewController'를 사용하는 것을 피하는 것이다. – Gaga

+0

그것은 스스로 처리 할 것이다. 행을 삭제하고 추가하는 동안 데이터 소스가 올바르게 처리되는지 확인해야합니다. 코드 부분에 대한 추가 도움이 필요하면 알려주십시오. – anaghaajith27

+0

감사합니다. @ anaghaajith27. 그러나 나는 단지 3-4 줄의 코드를 추가해야했기 때문에 Vivek Molkar가 더 쉽게 답을 찾았습니다. 인스턴스를 만드는 것이 실제로 훨씬 쉬웠습니다. 스토리 보드에서이를 수행하는 방법을 이해하지 못했습니다. – Gaga

관련 문제