質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.33%

TabBarControllerで、ちょっとだけStoryBoardを使う実装をしたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 781
退会済みユーザー

退会済みユーザー

xcode9.2
Swift4


画像の様にStoryBoard ReferenceでTab3つ(Slide,Second,Third)を作りました。

このMainTabBarControllerは、アプリ上でFacebookSDKログイン後に遷移するviewです。

Slideタブにセットしたクラスはこちらを参考に実装した
SlideMenuControllerSwiftで、

Slideタブは 実質 Firstタブです。(Slideの上に重なる、インスタンス化したmainVC(MainListViewController)がFirstタブの扱いになるイメージです。)

<initial指定されているタブのクラス>
・SlideすなわちFirst =(SlideMenuControllerSwift)
・Second = (SecondViewController)
・Third =  (ThirdViewController)

今回ストーリーボードはちょっとだけ使い、
ほとんどの部分をコードで、各Tabのクラスを実装していきたいです。
(各ストーリーボードを開いた人が、大体なんの為のviewなのか分かる程度のViewで済ませたい)

今この状態でRUNすると、
SlideタブにはSlideMenuControllerSwiftが表示されていますが、

・LeftMenuViewControllerを開く為のボタンをタップできず、反応しません。

マウスドラッグでそのLeftMenuViewControllerを開く事はできるのですが、

・LeftMenuViewControllerにある、ログアウトボタン(FBSDK)も同様にボタンをタップできず、反応しません。

この場合、navigationControllerが反応していない為、ボタンがタップできないのでしょうか?
表示はできているものの、TabBarにSlideMenuControllerSwiftを加えた事でタップできなくなったので、その原因を調べてはいるのですが、分かりません。

どなたかお分かりになる方、教えてください。
よろしくお願いします。

スライドです

import UIKit
import SlideMenuControllerSwift


class SlideViewController: SlideMenuController {


    override func awakeFromNib() {

        //これ自分と同じSBしか見ないよ(self.storyboard?...ということ)
        let mainVC = storyboard?.instantiateViewController(withIdentifier: "First")
        let leftVC = storyboard?.instantiateViewController(withIdentifier: "Left")

        //NavigationBarを生成
        let navigationController = UINavigationController(rootViewController: mainVC!)


        navigationController.navigationBar.barTintColor = UIColor.orange
        navigationController.navigationBar.tintColor = UIColor.black
        navigationController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]


        //ライブラリ特有のプロパティにセット
        mainViewController = navigationController
        leftViewController = leftVC


        /*SlideMenuOptions.leftViewWidth = 200*/

        super.awakeFromNib()        
    }


    override func viewDidLoad() {
        super.viewDidLoad()

     // Do any additional setup after loading the view.
    }



    //
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
メインです

import UIKit
import FBSDKCoreKit
import FBSDKLoginKit


class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        self.navigationController?.navigationBar.isHidden = false
        self.navigationItem.title = "ホーム"
        addLeftBarButtonWithImage(UIImage(named: "ic_reorder_2x")!)


    }


    @objc private func LeftSlidebutton() {
        self.slideMenuController()?.openLeft()
        self.slideMenuController()?.closeLeft()
    }

}
レフトです
import UIKit
import Firebase
import FirebaseAuth
import GoogleSignIn
import FBSDKCoreKit
import FBSDKLoginKit

class LeftMenuViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton()
        //表示されるテキスト
        button.setTitle("ログアウト", for: .normal)
        //テキストの色
        button.setTitleColor(UIColor.blue, for: .normal)

        //タップした状態の色
        button.setTitleColor(UIColor.red, for: .highlighted)
        //サイズ
        button.frame = CGRect(x: 0,y: 0,width: 400,height: 100)
        //タグ番号
        button.tag = 1
        //配置場所
        view.center = CGPoint(x:100, y:100)
        //ボタンをタップした時に実行するメソッドを指定
        button.addTarget(self, action: #selector(self.LogOutButton), for:.touchUpInside)
        view.addSubview(button)
    }

    //ログアウトボタン

    @objc func LogOutButton(sender: Any) {

        let alertController = UIAlertController(title: "ユーザーのお名前",message: "・・をログアウトしてもよろしいですか?", preferredStyle: UIAlertControllerStyle.alert)


        //        ②-1 OKボタンの実装
        let okAction = UIAlertAction(title: "ログアウト", style: UIAlertActionStyle.destructive){ (action: UIAlertAction) in

            //アラートが消えるのと画面遷移が重ならないように0.5秒後に画面遷移するようにしてる
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {



                //ログアウト遷移


                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let nextView = storyboard.instantiateViewController(withIdentifier: "Start") as! StartViewController
                self.present(nextView, animated: true, completion: nil)

                print("ログアウトしました")


            }



            //FB 1/30解決。{ (action: UIAlertAction)の中に含めることでOK時のみログアウトするようになった。

            let loginManager : FBSDKLoginManager = FBSDKLoginManager()
            loginManager.logOut()
            self.dismiss(animated: true, completion: nil)

        }

        //CANCELボタンの実装
        let cancelButton = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.cancel, handler: nil)


        //③-1 ボタンに追加
        alertController.addAction(okAction)
        //③-2 CANCELボタンの追加
        alertController.addAction(cancelButton)
        //④ アラートの表示
        present(alertController,animated: true,completion: nil)


    }



}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

-1

まだ自分自身スライドビューやナビバーについて理解不足のため、
Swift4対応_スライドメニューの実装方法などを参考に、今よりUIKitについて理解を深めたいと思います。
見ていただき、ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る