【问题标题】:navigating from uitableviewcell to multiple uinavigationcontroller using swrevealviewcontroller使用 swrevealviewcontroller 从 uitableviewcell 导航到多个 uinavigationcontroller
【发布时间】:2015-11-18 00:08:01
【问题描述】:

我是 swift 语言的新手,开始创建具有滑动菜单的存根应用程序。我使用来自http://www.appcoda.com/sidebar-menu-swift/ 的教程来创建幻灯片菜单,但想要创建动态而不是静态的应用程序,如示例所示。我在创建 segue 或从 uitableviewcell 导航到连接到相应 uinavigationcontroller 的相应 uiviewcontrollers 时遇到问题。

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

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;
        }
    }
}

以下是我的故事板截图:

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

以下是我的第 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.
    }   
}

编辑:

尝试了以下解决方案:

let vc = storyboard.instantiateViewControllerWithIdentifier("Category1") as! Category1
presentViewController(vc, animated: true, completion: nil)

上面的代码直接打开了带有上滑动画的类别 1 视图控制器,但它没有通过与相应视图控制器相连的导航控制器打开。

如果我使用以下代码:

let vc = storyboard.instantiateViewControllerWithIdentifier("Category1") as! Category1
self.revealViewController().setFrontViewController(vc, animated: true)

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

【问题讨论】:

  • 看起来你已经用故事板定义了接口,但同样,你也从 nib 文件加载它们。你认为这需要 Category1(nibName:"Category1", bundle:nil)。
  • @GeneratorOfOne 是正确的。您不需要通过 nib 文件加载视图控制器。而是给他们故事板ID并以这种方式加载它们,我认为您不需要执行self.navigationController.pushViewController,而是像这样设置SWRevealViewControllerfrontViewController(obj-c代码):[self.revealViewController setFrontViewController:newController];让我知道您是否需要 Objective-C 中的详细示例。抱歉,我不知道 Swift 的语法。
  • @GurtejSingh 请帮助我用 Objective-C 中的示例,这样我就可以知道我在哪里犯了愚蠢的错误。我也更新了我的 category1 类代码
  • @NiranjanBalkrishnaPrajapati 请给我一些时间,我会回答这个问题。
  • @GurtejSingh 我已经尝试过你和 GeneratorOfOne 建议这里是我的代码 'let vc = storyboard.instantiateViewControllerWithIdentifier("Category1") as! Category1 self.revealViewController().setFrontViewController(vc, animated: true)' 但它不能通过 navigationviewcontroller 工作,我认为它直接打开了 category1 屏幕

标签: ios swift uitableview swift2 swrevealviewcontroller


【解决方案1】:

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

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)
}

您还应该在 switch 语句结束后重置顶视图位置。应该是这样的(如果语法不正确,再次抱歉,请相应地修复):

self.revealViewController().setFrontViewPosition(FrontViewPosition.Left, animated: true)

在 Swift 中必须有类似的方法可以调用。

希望这会有所帮助。请原谅我的 SWIFT 语法并在需要时更正它。

【讨论】:

  • 实现了您对视图控制器在类别单击时更改的代码,但滑动菜单不会在类别单击时滑回。我是否缺少任何代码将其滑回菜单上单击切换按钮,即 uibarbutton 单击菜单滑回由于以下代码:“if self.revealViewController() != nil { menuBtn.target = self.revealViewController() menuBtn.action = "revealToggle:" self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) }"
  • @NiranjanBalkrishnaPrajapati 你打电话给这条线:self.revealViewController().setFrontViewPosition(FrontViewPosition.Left, animated: true) 吗?请参阅上面的更新代码。让我知道它是否有效。
  • 谢谢您的解决方案有效,并且 swift 语法也正确我很想向您学习objective-c 和swift,您是否可以帮助我提供教程或视频来学习它会很感激您。你也愿意成为我的朋友,所以我可以在遇到困难时寻求指导,请告诉我你的 fb id,以便我加你。
  • @NiranjanBalkrishnaPrajapati 没问题,伙计。我自己也学到了很多。我一定会尽我所能提供帮助:)。干杯
猜你喜欢
  • 2015-03-19
  • 1970-01-01
  • 2016-02-03
  • 2015-02-14
  • 1970-01-01
  • 2016-03-03
  • 2015-05-15
  • 2015-03-26
  • 1970-01-01
相关资源
最近更新 更多