侧栏菜单图标在基于标签栏的视图控制器中不可见

问题描述 投票:0回答:2

我已经使用SWRevealViewController实现了侧栏。但是当我使用基于标签栏的视图控制器执行相同操作时,菜单图标仅在基于选项卡的屏幕中不可见。图标在界面构建器中可见,但在模拟器/设备中不可见。即使在基于选项卡的视图控制器中,功能也在每个屏幕中都有效。当我从左向右拖动时,反之亦然,功能正常。只有问题是菜单图标在模拟器中是不可见的。谁能帮我?

提前致谢。

下面是选项卡的swift文件

import UIKit

class ItemOneViewController: UIViewController {


@IBOutlet weak var menuBar: UIBarButtonItem!
override func viewDidLoad() {
    super.viewDidLoad()

    setMenuBarBtn(menuBar: menuBar)

    navigationController!.navigationBar.barTintColor = UIColor.color(.blue)
}

func setMenuBarBtn(menuBar: UIBarButtonItem) {
    menuBar.target = revealViewController()
    menuBar.action = #selector(SWRevealViewController.revealToggle(_:))
    view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}

func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.portrait
}
} 

三个选项卡的代码类似。

在这里提问之前,我已完成以下任务

  1. 删除并重新创建屏幕两次。
  2. 交叉检查所有内容并比较基于标签栏的场景源代码与其他场景。
  3. 谷歌搜索它。

以下是供您参考的图片

Tab based screen with side bar functionality (working good)

Tab based screen without menu icon (Problem persist here , i want menu icon to be displayed)

HomeScreen with menu icon (Working good)

Navigation Controller attribute inspector

my storyboard

Item One View Controller view hierarchy

Item One view Controller related navigation controller scene

ios swift xcode uitabbarcontroller swrevealviewcontroller
2个回答
0
投票

你给了HomeViewController enter image description here添加正常按钮

然后直接通过故事板(来自汉堡菜单按钮)执行segue。

@IBAction func sideMenuBtnAction(_ sender: UIButton) {
         performSegue(withIdentifier: "sideMenu", sender: self)
    }

enter image description here然后在SideMenuController上:

import UIKit
import SideMenu

class SideMenuViewController: UIViewController {


    @IBOutlet var sideMenuTableView: UITableView!

    override func viewDidLoad() {
            super.viewDidLoad()

            SideMenuManager.default.menuPresentMode = .menuSlideIn
            SideMenuManager.default.menuFadeStatusBar = false
            SideMenuManager.default.menuWidth = self.view.frame.width / 1.4
            SideMenuManager.default.menuShadowOpacity = 0.3
            sideMenuTableView.tableFooterView = UIView(frame: .zero)
      }
 }

0
投票

你需要创建一个tabbarController类,如下所示,并将此ViewController类分配给storyboard上的tabbar ...我还没有测试过这段代码,但是这样的东西应该适合你的情况

class ViewController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()
    let firstSw = setRootViewControllerFor(identifier: "firstViewController") as! SWRevealViewController
    let secondsw = setRootViewControllerFor(identifier: "secondViewController") as! SWRevealViewController
    let thirdSw = setRootViewControllerFor(identifier: "thirdController") as! SWRevealViewController
    self.viewControllers = [firstSw,secondsw, thirdSw]
    // Do any additional setup after loading the view.
}

func setRootViewControllerFor(identifier:String)->SWRevealViewController
{
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let sw = storyboard.instantiateViewController(withIdentifier: "sw") as! SWRevealViewController
    self.view.window?.rootViewController = sw
    let destinationController = self.storyboard?.instantiateViewController(withIdentifier: identifier)
    let navigationController = UINavigationController(rootViewController: destinationController!)
    navigationController.navigationBar.isHidden=false
    navigationController.setNavigationTints()        //call your UI method to set 
    sw.setFront(navigationController, animated: true)
    return sw
}

/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}
*/

}

或者执行此操作后,无需创建tabbarController

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // create UIWindow with the same size as main screen
    window = UIWindow(frame: UIScreen.mainScreen().bounds)

    // create story board. Default story board will be named as Main.storyboard in your project.
    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    // create view controllers from storyboard
    // Make sure you set Storyboard ID for both the viewcontrollers in 
    // Interface Builder -> Identitiy Inspector -> Storyboard ID
    let firstSw = setRootViewControllerFor(identifier: "firstViewController") as! SWRevealViewController
    let secondsw = setRootViewControllerFor(identifier: "secondViewController") as! SWRevealViewController
    let thirdSw = setRootViewControllerFor(identifier: "thirdController") as! SWRevealViewController

    // Set up the Tab Bar Controller to have two tabs
    let tabBarController = UITabBarController()
    tabBarController.viewControllers =  [firstSw,secondsw, thirdSw]

    // Make the Tab Bar Controller the root view controller
    window?.rootViewController = tabBarController
    window?.makeKeyAndVisible()

    return true
}


 func setRootViewControllerFor(identifier:String)->SWRevealViewController
    {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let sw = storyboard.instantiateViewController(withIdentifier: "sw") as! SWRevealViewController
        self.view.window?.rootViewController = sw
        let destinationController = self.storyboard?.instantiateViewController(withIdentifier: identifier)
        let navigationController = UINavigationController(rootViewController: destinationController!)
        navigationController.navigationBar.isHidden=false
        navigationController.setNavigationTints()        //call your UI method to set 
        sw.setFront(navigationController, animated: true)
        return sw
    }
© www.soinside.com 2019 - 2024. All rights reserved.