web-dev-qa-db-ja.com

UINavigationBarボタンテキストを非表示

UINavigationControllerから[戻る]ボタンのテキストを非表示にするにはどうすればよいですか?私は「<」のみを持ち、「<Back」は持ちません

84
Nils

インターフェイスビルダーでは、前のコントローラーのナビゲーションアイテムを選択し、Back Button文字列を[戻る]ボタンの表示に変更できます。 たとえば、空白にする場合は、スペースを入れてください。

変更も可能次のコード行:

[self.navigationItem.backBarButtonItem setTitle:@"Title here"];

またはSwiftで:

self.navigationItem.backBarButtonItem?.title = ""

93
rebello95

ストーリーボードを使用してこれを行うこともできます。 前のコントローラーのナビゲーション項目の属性インスペクターでは、「戻る」ボタンフィールドに「」を設定できます。以下の画像を参照してください。 「ここのタイトル」を「」に置き換えます。これにより、目的の結果を達成できます。もう「タイトル」をいじる必要はありません。

プログラムで使用できます

[self.navigationItem.backBarButtonItem setTitle:@" "];

selfは、目的のViewコントローラーをプッシュするコントローラーを指します。

Xcode view controller navigation item

ナビゲーションバーの前後のサンプル

 Before

 After

78
Shahzin KS

次のようにUINavigationControllerDelegateを実装できます。

古いスウィフト

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

Swift 4.x

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }
}

backBarButtonItemはデフォルトでnilであり、次にプッシュされるコントローラーに影響するため、すべてのコントローラーに設定するだけです

61
VoidLess

戻るボタンのタイトルを@""またはnilに設定しても機能しません。ボタン全体を空に設定する必要があります(タイトルまたは画像なし):

Objective-C

[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];

Swift

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

これは、ナビゲーションスタックのView Controllerの上にあるView Controllerで実行する必要があります(つまり、pushViewControllerメソッドを使用してVCに移動する場所から)

37
jackal

大量のView Controllerがある場合のこの問題の別の解決策は、UIAppearanceプロキシを使用して、次のように戻るボタンのタイトルテキストを効果的に非表示にすることです。

UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];

[navBarButtonAppearance setTitleTextAttributes:@{
    NSFontAttributeName:            [UIFont systemFontOfSize:0.1],
    NSForegroundColorAttributeName: [UIColor clearColor] }
                                      forState:UIControlStateNormal];

このソリューションは、すべてのナビゲーションバーボタンに影響することを除いて、戻るボタンのタイトルを手動で@" "に設定するのと同様に、テキストを小さなクリアドットとしてレンダリングします。

これは、すべてのナビゲーションバーボタンに影響するため、この問題の一般的な解決策としてはお勧めしません。 非表示にするタイトルではなく、表示する場合ボタンのタイトルを選択するようにパラダイムを反転します。

タイトルをいつ表示するかを選択するには、必要に応じてタイトルテキスト属性を手動で復元するか、同じことを行うUIBarButtonItemの特殊なサブクラスを作成します(別のUIAppearanceプロキシを使用)。

戻るボタンのタイトルのほとんどを非表示にする必要があるアプリがあり、ナビゲーションボタンの一部のみがタイトル付きのシステムボタンである(またはまったくない)場合は、これが最適です!

(注:長いタイトルによって中央のナビゲーションバーのタイトルが移動しないようにするには、テキストの色がはっきりしていてもフォントサイズの変更が必要です)

29
Adam Kaplan

ViewDidLoadまたはloadViewに次のコードを追加します

self.navigationController.navigationBar.topItem.title = @"";  

IOS 9を搭載したiPhoneおよびiPadでテストしました

28
alones

このObjective-Cカテゴリを追加して、Navigation Controllerによって作成されたすべての「戻る」ボタンにテキストを含めないようにすることができます。 AppDelegate.mファイルに追加しました。

@implementation UINavigationItem (Customization)

/**
 Removes text from all default back buttons so only the arrow or custom image shows up.
 */
-(UIBarButtonItem *)backBarButtonItem
{
    return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

PS-(この拡張機能をSwiftで動作させる方法がわかりません。奇妙なエラーが発生していました。Swiftバージョンの追加を歓迎します)

14
teradyl

プログラムでバックボタンからテキストを削除するには、コードの下で使用します。これはxcode7以降で機能します。

self.navigationController.navigationBar.topItem.title = @ "";

または

ストーリーボードでmanualLyを選択し、View Controllerのナビゲーションバーを選択して、戻るボタンのテキストに「」を入力します。

これは動作します。ありがとう

10

副作用なしで機能する唯一のものは、カスタムの戻るボタンを作成することです。カスタムアクションを提供しない限り、スライドジェスチャも機能します。

extension UIViewController {
func setupBackButton() {
    let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = customBackButton
}}

残念ながら、すべての戻るボタンにタイトルを付けたくない場合は、すべてのView Controllerでこのカスタムの戻るボタンを設定する必要があります:/

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}

空の文字列ではなく、タイトルとして空白を設定することが非常に重要です。

9
Cezar Signori

現在の答えはうまくいきませんでした。 タイトルを削除する完全にしたかったのですが、「戻る」というテキストは消えませんでした。

前のView Controllerに戻り、そのtitleプロパティを設定します:

self.title = @" ";

ONLY前のView Controllerにタイトルがない場合に機能する

7
ChrisHaze

上記のいくつかを試しましたが、うまくいきませんでした。これは私のために働いた:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.topItem?.title = ""
}
5
catanore

別の方法-カスタムNavigationBarクラスを使用します。

class NavigationBar: UINavigationBar {

    var hideBackItem = true
    private let emptyTitle = ""

    override func layoutSubviews() {
        if let `topItem` = topItem,
            topItem.backBarButtonItem?.title != emptyTitle,
            hideBackItem {
            topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
        }

        super.layoutSubviews()
    }

}

つまり、プロジェクト全体のタイトルを削除します。 UINavigationControllerのカスタムクラスを設定するだけです。

4
LLIAJLbHOu

NavigationControllerをオーバーライドするカスタムpushViewControllerを使用します

class NavigationController: UINavigationController {  
  override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    viewController.navigationItem.backBarButtonItem =
      UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    super.pushViewController(viewController, animated: animated)
  }
}
4
onmyway133

すでに多くの答えがあります。この件に関する私の2セントです。このアプローチは非常に堅牢であることがわかりました。セグエの前にこれをviewControllerに入れるだけです。

Swift 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
4
Satnam Sync

前のVCのタイトルをスペースを含む「」文字列に設定します。 [戻る]ボタンのあるタイトルは、単一のスペース文字列に置き換えられます。

Self.title = " "

戻るボタンをもう一度押すと、viewWillAppearのタイトルが元のタイトルにリセットされます。

4
Mohit Kumar

Swift 3.1これを行うには、UINavigationControllerのデリゲートメソッドを実装します。

func navigationController(_ navigationController: UINavigationController, 
                          willShow viewController: UIViewController, animated: Bool) {

    /** It'll hide the Title with back button only,
     ** we'll still get the back arrow image and default functionality.
     */
    let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                               action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

この投稿のすべてを試しました。唯一の有効なソリューションは@VoidLessの

ここに同じ答えがありますが、より完全です

class CustomNavigationController: UINavigationController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.delegate = self
    }
}


// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    }
}

Swift3では、

グローバル設定を設定した場合

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // ..

    let BarButtonItemAppearance = UIBarButtonItem.appearance()
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)


    // ...

}
2
taku_oka

これはiOS11の私の解像度です。applicationDidFinishLaunchingWithOptionsのUIBarButtonItemの外観を変更します。

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)

Yオフセットを変更することはできません。iOS11ではバックバーボタンの位置も変更されるためです。ただし、iOS10以下ではOKです。

1
VictorChee

戻るボタンのタイトルをグローバルに非表示にする場合。

このようにviewDidLoadUIViewControllerをスウィズルできます。

+ (void)overrideBackButtonTitle {

    NSError *error;

    // I use `Aspects` for easier swizzling.

    [UIViewController aspect_hookSelector:@selector(viewDidLoad)
                              withOptions:AspectPositionBefore
                               usingBlock:^(id<AspectInfo> aspectInfo)
    {

        UIViewController *vc = (UIViewController *)aspectInfo.instance;

        // Check whether this class is my app's view controller or not.
        // We don't want to override this for Apple's view controllers,
        // or view controllers from external framework.

        NSString *className = NSStringFromClass([vc class]);
        Class class = [NSBundle.mainBundle classNamed:className];
        if (!class) {
           return;
        }

        UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
        vc.navigationItem.backBarButtonItem = backButton;

    } error:&error];

    if (error) {
        NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
    }

}

使用法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[self class] overrideBackButtonTitle];
    return YES;
}
1
nRewik

最後に、アプリ全体でデフォルトのバックテキストを非表示にする完璧なソリューションを見つけました。

透明な画像を1つ追加し、AppDelegateに次のコードを追加するだけです。

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
0
Lalit Kumar

私のソリューション:-XCode:10.2.1-Swift:5

  • 親ビューコントローラー:
    • self.title = ""
  • 子ビューコントローラー:
    • self.navigationItem.title = "Your title" // viewcontrollerのタイトルを設定する
0
PhuocLuong

カスタムNavigation Controllerがあるため、これに苦労していました。カスタムナビゲーションコントローラークラスoverride func viewDidLayoutSubviews() { self.navigationBar.backItem?.title = "" }のこのコードを使用して、すべてのView Controllerのバックアイテムテキストを削除できました

これにより、このカスタムNavigation Controllerを使用して、バックアイテムのタイトルがすべて削除されます。

0
Amy.R

バックテキストは、最後のView ControllerのnavigationItem.title、およびnavigationItem.titleから取得され、self.titleによって自動的に設定されます。問題を解決する簡単な方法はsetTitle:をフックすることです。navigationItem.title = @""を確認してください

このコードをAppDelegate.mに置くと大丈夫です。

    [UIViewController aspect_hookSelector:@selector(setTitle:)
                              withOptions:AspectPositionAfter
                               usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
        UIViewController *vc = aspectInfo.instance;
        vc.navigationItem.titleView = ({
            UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
            titleLabel.text = title;
            titleLabel;
        });
        vc.navigationItem.title = @"";
    } error:NULL];

詳細は https://www.jianshu.com/p/071bc50f1475 (Simple Chinease)

0
fengxing
-(void)setNavigationItems{
     UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];   
     self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
    [self.navigationController popViewControllerAnimated:YES];
}
0
neeraj singla

IOS 11では、UIBarButtonItemの外観のテキストフォント/色を非常に小さい値またはクリアカラーに設定すると、他のバー項目が消えることがわかりました(システムはUIBarButton項目のクラスをもはや尊重せず、_UIModernBarButtonに変換します)。また、バックテキストのオフセットをオフスクリーンに設定すると、インタラクティブポップ中にフラッシュが発生します。

そこで、addSubViewをスウィズルしました:

+ (void)load {
    if (@available(iOS 11, *)) {
        [NSClassFromString(@"_UIBackButtonContainerView")     jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
    }
}

- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
    view.alpha = 0;
    if ([view isKindOfClass:[UIButton class]]) {
        UIButton *button = (id)view;
        [button setTitle:@" " forState:UIControlStateNormal];
    }
    [self MyiOS11BackButtonNoTextTrick_addSubview:view];
}
0
sbhhbs