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

时间:2019-04-24 10:58:45

标签: ios swift xcode uitabbarcontroller swrevealviewcontroller

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

谢谢。

下面是标签的快速文件

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

2 个答案:

答案 0 :(得分: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)
      }
 }

答案 1 :(得分:0)

您需要创建如下所示的tabbarController类,并将此ViewController类分配给故事板上的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
    }