[swift4] スライドメニューを実現できる「SlideMenuControllerSwift」の実装方法

スライドメニューを実現できる「SlideMenuControllerSwift」の実装方法は以下の通り

https://github.com/dekatotoro/SlideMenuControllerSwift

SlideMenuControllerSwift3

目次

Podでインストール

Podファイルに以下のコードを追加

pod 'SlideMenuControllerSwift', :git => 'https://github.com/dekatotoro/SlideMenuControllerSwift', :branch => 'swift4'

 

追加したら

pod install --repo-update

でインストール。

 

 

概要

SlideMenuControllerという土台にMainとLeft、Rightという最大3枚のViewControllerを追加することができる。

最初はMainが表示されるが、Leftを開くという命令が発行されるとLeftと定義しているViewControllerが左に指定サイズだけ表示される。

Leftが表示されている間でもMainのスレッドは停止せずに実行しつづける。

 

コード実装

MainViewController.swift

import SlideMenuControllerSwift 

class MainViewController: UIViewController {
 
 ...
 
 @objc private func didTapLeftMenuIcon() {
  self.slideMenuController()?.openLeft()
 }
 
 @objc private func didTapRightMenuIcon() {
 self.slideMenuController()?.openRight()
 }

 ...

}

 

LeftViewContoller.swift

import UIKit
 
class LeftMenuViewController: UIViewController {
 
 override func viewDidLoad() {
 super.viewDidLoad()
 
 // Do any additional setup after loading the view.
 }
}

StoryBoard上のIDに「Left」と設定

 

 

RightViewContoller.swift

import UIKit
 
class RightViewContoller: UIViewController {
 
 override func viewDidLoad() {
 super.viewDidLoad()
 
 // Do any additional setup after loading the view.
 }
}

StoryBoard上のIDに「Right」と設定

 

 

AppDelegate.swift

import SlideMenuControllerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

 var window: UIWindow?


 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
 // Override point for customization after application launch.

 let mainVC = storyboard.instantiateViewController(withIdentifier: "Main")
 let rightVC = storyboard.instantiateViewController(withIdentifier: "Right") as! RightViewController
 let leftVC = storyboard.instantiateViewController(withIdentifier: "Left") as! LeftViewController
 let viewController = SlideMenuController(mainViewController: mainVC, leftMenuViewController: leftVC, rightMenuViewController: rightVC)
 
 self.window?.rootViewController = viewController
 self.window?.makeKeyAndVisible()
 
 return true
 }

NavigationBarを追加したい場合は、

import SlideMenuControllerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

 var window: UIWindow?


 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
 // Override point for customization after application launch.

 let mainVC = storyboard.instantiateViewController(withIdentifier: "Main")
 let rightVC = storyboard.instantiateViewController(withIdentifier: "Right") as! RightViewController
 let leftVC = storyboard.instantiateViewController(withIdentifier: "Left") as! LeftViewController
 let navigationController = UINavigationController(rootViewController: mainVC!)
 let viewController = SlideMenuController(mainViewController: navigationController, leftMenuViewController: leftVC, rightMenuViewController: rightVC)
 
 self.window?.rootViewController = viewController
 self.window?.makeKeyAndVisible()
 
 return true
 }

補足

LeftやRightのViewControllerでMainのViewContollerの関数を実行するには、通常のSwiftと同じくProtocolを設定してDelegateすれば良い。

RightViewContoller.swift

import UIKit

protocol RightViewControllerDelegate: class {
 func didselectMode(mode:String)
 
}
class RightViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
 
 @IBOutlet weak var tableView: UITableView!
 
 weak var delegate: RightViewControllerDelegate?
 
 //要素
 var posts:[string] = ["Google","Apple","Facebook","Amazon"]
 
 //MARK: didload
 override func viewDidLoad() {
  super.viewDidLoad()
 
  tableView.dataSource = self
  tableView.delegate = self
 
 }
 
 //MARK: TableView Method
 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  return posts.count
 }
 
 
 func numberOfSections(in tableView: UITableView) -> Int { // sectionの数を決める
  return 1
 }
 
 
  //MARK: cellSetting
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
 
  let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
 
  let label = cell.contentView.viewWithTag(1) as! UILabel

  label.text = posts[indexPath.row]
  
  return cell
 
 }
 
 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  self.delegate?.didselectMode(mode: posts[indexPath.row]!)
 
 }
 
}

 

MainViewContoller.swift

extension MainViewController: RightViewControllerDelegate {
 
 func didselectMode(mode: String) {
  print("didselectMode is \(mode)")
  self.closeRight() //右を閉じる
  //その他処理
 
 }

AppDelegate.swift

import SlideMenuControllerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

 var window: UIWindow?


 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
 // Override point for customization after application launch.

 let mainVC = storyboard.instantiateViewController(withIdentifier: "Main")
 let rightVC = storyboard.instantiateViewController(withIdentifier: "Right") as! RightViewController
 let leftVC = storyboard.instantiateViewController(withIdentifier: "Left") as! LeftViewController
 rightVC.delegate = mainVC as! RightViewControllerDelegate //重要

 let viewController = SlideMenuController(mainViewController: mainVC, leftMenuViewController: leftVC, rightMenuViewController: rightVC)
 
 self.window?.rootViewController = viewController
 self.window?.makeKeyAndVisible()
 
 return true
 }

NavigationBarを追加したい場合は、

これでRightViewContollerのTableViewのセルを選択した際に、指定StringをMainに渡すことができる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です