0

我正在处理注册过程后将出现主屏幕的应用程序。并且 SWRevealViewController 已在主屏幕中配置。

我想以编程方式配置 SWRevealViewController。

下面是我的代码

let storyboard = UIStoryboard(name: "MainSW", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
        let rvc:SWRevealViewController = self.revealViewController() as SWRevealViewController
        rvc.pushFrontViewController(vc, animated: true)

但它给了我如下错误。

无法将“UINavigationController”(0x110d9f860)类型的值转换为“SWRevealViewController”(0x10dc346b8)。

我也试过下面的链接

SWRevealViewController 解决方案

但这也对我没有帮助。

4

1 回答 1

1

这是我的配置方式:

我创建了 2UIBarButtonItem作为属性HomeViewController(我将在代码中设置它们)

let leftButton = UIBarButtonItem()
let rightButton = UIBarButtonItem()

viewDidLoad方法中:

revealViewController().delegate = self

viewWillAppear方法中:

if (revealViewController() != nil) {

      revealViewController().rearViewRevealWidth = -50
      revealViewController().rightViewRevealWidth = -50

      leftButton.image = UIImage(named: "yourImageName")! // check that the image exists, don't use !
      leftButton.style = .plain
      leftButton.target = revealViewController()
      leftButton.action = #selector(SWRevealViewController.revealToggle(_:))

      rightButton.image = UIImage(named: "yourImageName")! // check that the image exists, don't use !
      rightButton.style = .plain
      rightButton.target = revealViewController()
      rightButton.action = #selector(SWRevealViewController.rightRevealToggle(_:))

      view.addGestureRecognizer(revealViewController().panGestureRecognizer())
      view.addGestureRecognizer(revealViewController().tapGestureRecognizer())
}

这是我用来在 HomeViewController 中设置 SWRevealViewController 以便拥有左右菜单的所有代码。

您现在可以使用委托方法来自定义您喜欢的行为:

extension HomeViewController: SWRevealViewControllerDelegate {

    func revealController(_ revealController: SWRevealViewController!, willMoveTo position: FrontViewPosition) {          
        view.alpha = position == FrontViewPosition.left ? 1.0 : 0.6
    }
}

我在 HomeViewController 上设置了一个 alpha,以便在它不在前面时使它变暗。

对于情节提要部分

  • 在 Storyboard 中创建一个 UIViewController。
  • 将其类更改为 SWRevealViewController
  • 再创建 2 个 UIViewControllers(1 个用于左侧菜单,1 个用于右侧菜单。如果您只想要 1 个菜单,请根据需要申请左侧或右侧)
  • 将 SWRevealViewController 链接到带有 segues (rearrightsegues)的 2 个 UIViewControllers
  • 将 SWRevealViewController 链接到您的 UINavigationController 与front segue.
  • 将 UINavigationController 与您的 HomeViewController 链接(使用root relationship

请记住,您可能还想为 RegisterViewController 和 HomeViewController 之间的转换创建自定义 segue。

您也可以通过编程方式创建它:

class RegisterToHomeSegue: UIStoryboardSegue {

    override func perform() {

        let source = self.source as! RegisterViewController
        let homeVC = self.destination as! HomeViewController

        let window = source.view.window
        window?.rootViewController = homeVC
        window?.addSubview(source.view)

        UIView.transition(from: source.view, to: homeVC.view, duration: 0.50, options: .transitionCrossDissolve, completion: nil)
    }
}

并在Storyboard将类从您RegisterViewController的更改为SWRevealViewController新的类RegisterToHomeSegue并给它一个标识符。这样RegisterViewController您就可以调用:

performSegue(withIdentifier: "yourIdentifier", sender: nil)

而且voilà,您现在拥有:

  • RegisterViewController 和 HomeViewController 之间的良好过渡
  • 您的 SWRevealController 设置正确,其左右菜单
  • 左右键项目,带有点击手势打开相应菜单
  • 更改 HomeViewController 打开时的 alpha

告诉我它是否对你有帮助。

于 2019-01-16T10:28:57.477 回答