使用swrevealviewcontroller从uitableviewcell导航到多个uinavigationcontroller

Nir*_*ati 3 uitableview ios swrevealviewcontroller swift swift2

我是swift语言的新手,并开始创建具有滑动菜单的存根应用程序.我使用http://www.appcoda.com/sidebar-menu-swift/中的教程来创建幻灯片菜单,但是想要创建动态而非静态的应用程序,如示例所示.我在创建赛格瑞或从做导航面临的问题uitableviewcell到各自uiviewcontrollers连接到相应的UINavigationController.

以下是滑动菜单类的代码:

MenuController.swift

import UIKit

class MenuController:UITableViewController
{
    let menuControlList = ["Category 1", "Category 2", "Category 3", "Category 4"]

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    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 the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Return the number of rows in the section.
        return menuControlList.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! MenuTableCell

        let row  = indexPath.row
        cell.menuCellText.text = menuControlList[row]
        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("row clicked :: ", indexPath.row)

        switch indexPath.row
        {
        case 0:
            var cat1View = Category1(nibName:"Category1", bundle:nil)
            self.navigationController?.pushViewController(cat1View, animated: true)
            print(indexPath.row)
            break

        case 1:
            var cat2View = Category2(nibName:"Category2", bundle:nil)
            self.navigationController?.pushViewController(cat2View, animated: true)
            print(indexPath.row)
            break

        case 3:
            var cat3View = Category3(nibName:"Category3", bundle:nil)
            self.navigationController?.pushViewController(cat3View, animated: true)
            print(indexPath.row)
            break

        case 4:
            var cat4View = Category4(nibName:"Category4", bundle:nil)
            self.navigationController?.pushViewController(cat4View, animated: true)
            print(indexPath.row)
            break

        default:
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我的故事板的截图:

在此输入图像描述

如果我在创建这个时遇到任何错误,请告诉我并帮助我纠正它.

以下是我的类别1类的代码:

class Category1 :UIViewController
{

    @IBOutlet var menuBtn: UIBarButtonItem!


    override func viewDidLoad() {
        super.viewDidLoad()

        if self.revealViewController() != nil {
            menuBtn.target = self.revealViewController()
            menuBtn.action = "revealToggle:"
            self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }   
}
Run Code Online (Sandbox Code Playgroud)

编辑:

尝试以下解决方案:

let vc = storyboard.instantiateViewControllerWithIdentifier("Category1") as! Category1
presentViewController(vc, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

上面的代码直接打开了带有幻灯片动画的1类视图控制器,但它没有通过附带相应viewcontroller的navigationcontroller打开.

如果我使用以下代码:

let vc = storyboard.instantiateViewControllerWithIdentifier("Category1") as! Category1
self.revealViewController().setFrontViewController(vc, animated: true)
Run Code Online (Sandbox Code Playgroud)

上面的代码也加载了viewcontroller但滑动菜单没有滑回?

Gur*_*ngh 5

首先,为导航视图控制器提供故事板ID,而不是实际的视图控制器.因此,例如,如果Category1嵌入在导航控制器中,则为导航控制器Category1NavController提供例如故事板ID .那你的代码应该如下:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print("row clicked :: ", indexPath.row)

    switch indexPath.row
    {
    case 0:
        let navController1 = storyboard.instantiateViewControllerWithIdentifier("Category1NavController") as! UINavigationController 
        self.revealViewController().setFrontViewController(navController1, animated: true)
        print(indexPath.row)
        break
    ..........
    // Handle other cases similarly here
    case 1:
    .....
    case 2:
    .....   
    default:
        return;
    }
    self.revealViewController().setFrontViewPosition(FrontViewPosition.Left, animated: true)
}
Run Code Online (Sandbox Code Playgroud)

您还应该在switch语句结束后重置Top View位置.这是应该的样子(如果语法不正确,请再次抱歉,请相应修改):

self.revealViewController().setFrontViewPosition(FrontViewPosition.Left, animated: true)
Run Code Online (Sandbox Code Playgroud)

在Swift中必须有一个类似的方法.

希望这可以帮助.请原谅我的SWIFT语法并在需要时进行更正.