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

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

ただいまの
回答率

87.92%

実装したleftBarButtonItemが表示されなくなり、<Backになってしまう。

解決済

回答 1

投稿 編集

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

退会済みユーザー

swift4
xcode9.2

一番下のコードLoginControllerにFBSDKログインを実装しています。

ログイン後CustomTabBarControllerへ遷移します。

CustomTabBarControllerの一部です。

//1
のように紐づけられた4つのビューを定義し、viewControllersでまとめています。
プロトコルにUINavigationControllerなどはありません。

...

// 1
        let  syutsudaiController = syutsudaiController()
        syutsudaiController.navigationItem.title = "出題"


        let firstNavigationController = UINavigationController(rootViewController: syutsudaiController)
        firstNavigationController.title = ""
        firstNavigationController.tabBarItem.image = UIImage(named: "yubi")

        ...

CustomTabBar...の
self.navigationItem.hidesBackButton = true
にすると<Back ボタンが消え、ナビバーには何も表示されません。

CustomTabBar...をfalseにして、逆に
紐づけられた4つのビューの
self.navigationItem.hidesBackButton = true
にしても<Back ボタンは表示されます。

私があらかじめ実装していたボタンAを
self.navigationItem.leftBarButtonItemで表示していたのですが、
CustomTabBar...のhidesBackButton = falseにしても、
<Backボタンが表示されていまい、ボタンAを無くなりました。

LoginControllerを介さず、
イニシャルビューをCustomTabBarControllerとして起動すれば、ボタンAは表示されます。

原因がわからない為、質問させていただきます。
よろしくお願いします。

LoginControllerです

import UIKit
import Firebase
import FBSDKLoginKit
import FBSDKCoreKit

import FirebaseAuth
import FirebaseDatabase


class LoginController: UIViewController, FBSDKLoginButtonDelegate {


    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.hidesBackButton = true


        //すでにログインしてる時🎄
        if (FBSDKAccessToken.current() != nil)
        {

            let vc = CustomTabBarController()
            self.navigationController?.pushViewController(vc, animated: true)

        } else {

        //FBログイン
    let loginButton = FBSDKLoginButton()
    view.backgroundColor = .white
        loginButton.frame = CGRect(x: 16, y: 200, width: view.frame.width - 32, height: 50)

        loginButton.delegate = self
        loginButton.readPermissions = ["email", "public_profile"]

        view.addSubview(loginButton)
        }
}


    //FBログイン
    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {

        if error != nil {
            print("エラー")
        }
        else if result.isCancelled {
            print("キャンセル")
        }

        //コンソールに表示
        FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start { (connection, result, error) in

            if error != nil {
                print("Failed to start graph requeest", error!)
                return
            }

            fb()
            print(result!)
        }




       func fb() {
            let accessToken = FBSDKAccessToken.current()
            guard let accessTokenString = accessToken?.tokenString else { return }

            let credentials =
                FacebookAuthProvider.credential(withAccessToken: accessTokenString)


            Auth.auth().signIn(with: credentials, completion: { (user, error) in


                if error != nil {

            print("Something went wrong with our FB user: ", error ?? "")
            return
                } else {
                print("Successfully logged in with our FB user: ", user ?? "")

                    let vc = CustomTabBarController()
                    self.navigationController?.pushViewController(vc, animated: true)

                }

            })
        }
    }


    func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {
        print("ログアウト")
    }
}

//追記しました。
内容に不備があった為、大幅に本文を修正しました。申し訳ありません。

//syutsudaiControllerコードを追記しました。

syutsudaiControllerの一部です。

import UIKit

class syutsudaiController: UITableViewController {

    //ボタン
    private var qButton: UIBarButtonItem!


    let cellId = "cellId"
    let headerId = "headerId"
    var items = ["Item 1", "Item 2", "Item 3"]



    override func viewDidLoad() {
        super.viewDidLoad()

//ここです🎄
self.navigationItem.hidesBackButton = false



        tableView.backgroundColor = .white
        tableView.sectionHeaderHeight = 50

        tableView.register(MyCell.self, forCellReuseIdentifier: "cellId")
        tableView.register(Header.self, forHeaderFooterViewReuseIdentifier: "headerId")


        //
        qButton = UIBarButtonItem(title: "あ", style: .plain, target: self, action: #selector(onClickButton))

        self.navigationItem.leftBarButtonItem = qButton
    }



    //ボタン
    @objc func onClickButton(_ sender: UIButton){

        let layout = UICollectionViewFlowLayout()

        let vc = MyPageController(collectionViewLayout: layout)
        layout.itemSize = CGSize(width: view.frame.width, height: view.frame.height)
        navigationController?.pushViewController(vc, animated: true)
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/04/02 13:15 編集

    newmt様 勿論です。ありがとうございます。
    追記しました!

    キャンセル

  • newmt

    2018/04/02 13:48

    まだ再現できていないので違うかもしれませんが、let firstNavigationController = UINavigationController(rootViewController: syutsudaiController)をself.navigationController?.pushViewController(syutsudaiController, animated: true)にすると何か変わりますでしょうか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/04/02 14:00

    self.navigationController?push...を追記してみましたが変わりませんでした...

    キャンセル

回答 1

checkベストアンサー

+1

質問欄だと読みづらくなるので回答に記載します。

syutsudaiControllerの中で

//ここです🎄
self.navigationItem.hidesBackButton = true


として

qButton = UIBarButtonItem(title: "あ", style: .plain, target: self, action: #selector(onClickButton))
self.navigationItem.leftBarButtonItem = qButton


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    qButton = UIBarButtonItem(title: "あ", style: .plain, target: self, action: #selector(onClickButton))
    self.navigationItem.leftBarButtonItem = qButton

    // または
    //self.navigationController?.navigationBar.topItem?.leftBarButtonItem = qButton
}


に移動するとどうなりますでしょうか?

【追記】
コメントでのやり取りにより最終的には以下の方法になりました。

LoginControllerからCustomTabBarControllerに遷移する際にrootViewControllerを入れ替える

let vc = CustomTabBarController()
let delegate = UIApplication.shared.delegate as! AppDelegate
delegate.window?.rootViewController = vc

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/02 20:42 編集

    ログイン、ログアウト時の遷移は 私が書いていたpush遷移ではなく、
    rootViewControllerを今回教えていただいた方法で切り替えて、
    遷移させた方が使い勝手は良いのでしょうか?
    ログイン前のビューとログイン後は切り離した方が良いのかな?と思いましたので...

    先日もお世話になりましたし、今回も大変お時間頂きました。
    理解が深まりとても助かりました ありがとうございました。
    仰るサイトも参考にさせて頂きます。

    キャンセル

  • 2018/04/03 06:27

    個人的には、戻るボタンを抑える処理が不要になり、これまでの画面の重なりを一度クリアするためにも、ログイン、ログアウト時にrootViewControllerを入れ替えるような方法を取ることは結構あります。

    キャンセル

  • 2018/04/03 12:29

    いやーもう本当に分かりやすいです。感謝です。

    キャンセル

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

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

関連した質問

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