переход от uitableviewcell к нескольким контроллерам uinavigation с использованием srevealviewcontroller

Я новичок в быстром языке и начинаю создавать приложение-заглушку со скользящим меню. Я использовал учебник из http://www.appcoda.com/sidebar-menu-swift/ для создания слайд-меню, но хотите создать динамическое, а не статическое приложение, как показано в примере. Я столкнулся с проблемой создания перехода или перехода от uitableviewcell к соответствующему uiviewcontrollers, который подключен к соответствующему контроллеру uinavigation.

Ниже приведен код класса скользящего меню:

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)

приведенный выше код также загружает контроллер просмотра, но скользящее меню не скользит обратно?


person Niranjan Balkrishna Prajapati    schedule 24.08.2015    source источник
comment
Похоже, вы определили интерфейсы с раскадровкой, но опять же, вы также загружаете их из файла пера. Как вы думаете, понадобится ли это Category1(nibName:Category1, bundle:nil).   -  person Sandeep    schedule 24.08.2015
comment
@GeneratorOfOne верен. Вам не нужно будет загружать контроллеры представления через файлы пера. Вместо этого дайте им идентификатор раскадровки и загрузите их таким образом, и я не думаю, что вам нужно делать self.navigationController.pushViewController, вместо этого установите frontViewController из SWRevealViewController следующим образом (код obj-c): [self.revealViewController setFrontViewController:newController]; Дайте мне знать, если вам нужен подробный пример в Objective-C. Извините, я не знаю синтаксиса в Swift.   -  person Gurtej Singh    schedule 26.08.2015
comment
@GurtejSingh, пожалуйста, помогите мне с примером в Objective-C, чтобы я мог понять, где я делаю глупую ошибку. Я также обновил код класса категории 1.   -  person Niranjan Balkrishna Prajapati    schedule 28.08.2015
comment
@NiranjanBalkrishnaPrajapati, дайте мне немного времени, и я отвечу на вопрос.   -  person Gurtej Singh    schedule 28.08.2015
comment
@GurtejSingh Я попробовал то, что вы и GeneratorOfOne предложили, вот мой код «let vc = storyboard.instantiateViewControllerWithIdentifier(Category1) as! Category1 self.revealViewController().setFrontViewController(vc, анимированный: true) ', но он не работает через navigationviewcontroller, и я думаю, что он напрямую открывает экран категории 1   -  person Niranjan Balkrishna Prajapati    schedule 28.08.2015
comment
@NiranjanBalkrishnaPrajapati Хорошо, ты на правильном пути, приятель, посмотри мой ответ ниже и дай мне знать, если он поможет.   -  person Gurtej Singh    schedule 28.08.2015


Ответы (1)


Прежде всего, дайте вашим контроллерам представления навигации идентификатор раскадровки, а не фактические контроллеры представления. Так, например, если Category1 встроен в контроллер навигации, дайте контроллеру навигации идентификатор раскадровки, например, 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)
}

Вы также должны сбросить положение Top View после завершения оператора switch. Вот как это должно быть (еще раз извините, если синтаксис неверен, исправьте соответственно):

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

В Swift должен быть аналогичный метод.

Надеюсь это поможет. Пожалуйста, извините мой синтаксис SWIFT и исправьте его, если это необходимо.

person Gurtej Singh    schedule 28.08.2015
comment
реализовано, что вы кодируете изменение контроллеров представления при щелчке категории, но меню слайдов не скользит назад при щелчке категории. Я пропустил какой-либо код, чтобы сдвинуть его обратно в меню, нажмите кнопку переключения, т.е. нажмите кнопку uibar, меню скользит назад из-за следующего кода: if self.revealViewController()!= nil { menuBtn.target = self.revealViewController() .action = раскрытьToggle: self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) } - person Niranjan Balkrishna Prajapati; 28.08.2015
comment
@NiranjanBalkrishnaPrajapati, вы звоните по этой линии: self.revealViewController().setFrontViewPosition(FrontViewPosition.Left, animated: true)? См. мой обновленный код выше. Дайте мне знать, если это работает. - person Gurtej Singh; 28.08.2015
comment
Спасибо, ваше решение сработало, и синтаксис swift также правильный. Я хотел бы узнать у вас Objective-C и Swift, поможете ли вы мне с учебными пособиями или видео для изучения. Буду признателен вам. Также вы будете моим другом, чтобы я мог попросить совета, когда я застрял, пожалуйста, дайте мне знать ваш идентификатор fb, чтобы я мог добавить вас. - person Niranjan Balkrishna Prajapati; 28.08.2015
comment
@NiranjanBalkrishnaPrajapati, нет проблем, приятель. Я сам многому учусь. Обязательно постараюсь помочь чем смогу :). Ваше здоровье - person Gurtej Singh; 28.08.2015