戻るボタンのテキストをUINavigationコントローラーから非表示にするにはどうすればよいですか?「<」のみがあり、「<戻る」はありません
戻るボタンのテキストをUINavigationコントローラーから非表示にするにはどうすればよいですか?「<」のみがあり、「<戻る」はありません
回答:
インターフェイスビルダーで、前のコントローラーのナビゲーション項目を選択し、Back Button
文字列を[戻る]ボタンの表示方法に変更できます。たとえば、空白にしたい場合は、スペースを1つ入れます。
次のコード行でも変更できます。
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
またはSwiftで:
self.navigationItem.backBarButtonItem?.title = ""
Back Button
がすでにIBで空白になっている場合は、乗るスペースを追加しBack
て矢印を表示するだけです。
ストーリーボードを通じてこれを行うこともできます。以前のコントローラーのナビゲーションアイテムの属性インスペクターでは、[戻る]ボタンフィールドに ""を設定できました。下の画像を参照してください。「ここのタイトル」を「」に置き換えます。これを行うことにより、目的の結果が得られます。「タイトル」をいじる必要はもうありません。
プログラムで使用できます
[self.navigationItem.backBarButtonItem setTitle:@" "];
ここで、selfは、目的のViewコントローラをプッシュするコントローラを指します。
ナビゲーションバーの前、後のサンプル
前
後
backBarButtonItem
プログラムによる設定は機能しませんが、ストーリーボードから設定することはできます。
次のUINavigationControllerDelegate
ように実装できます:
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
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
、デフォルトでは、それは次のプッシュされ、コントローラに影響するので、あなただけのすべてのコントローラのためにそれを設定します
戻るボタンのタイトルをに設定する@""
か、機能しnil
ません。ボタン全体を空にする必要があります(タイトルまたは画像なし):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
これは、ナビゲーションスタック内のビューコントローラーの上にあるビューコントローラーで実行する必要があります(つまり、pushViewController
メソッドを介してVCに移動する場所から)
View Controllerが大量にある状況でのこの問題の別の解決策は、UIAppearance
プロキシを使用して、次のように戻るボタンのタイトルテキストを効果的に非表示にすることです。
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
このソリューションは、@" "
すべてのナビゲーションバーボタンに影響することを除いて、手動で戻るボタンのタイトルをに設定するのと同じように、テキストを小さなクリアドットとしてレンダリングします。
これはすべてのナビゲーションバーボタンに影響するため、この問題の一般的な解決策としてはお勧めしません。タイトルを非表示にするときではなく、ボタンのタイトルを表示するときを選択できるように、パラダイムを反転させます。
タイトルを表示するタイミングを選択するには、必要に応じて手動でタイトルテキスト属性を復元するかUIBarButtonItem
、同じことを行う(別のUIAppearance
プロキシを使用する可能性がある)専用のサブクラスを作成します。
戻るボタンのタイトルのほとんどを非表示にする必要があるアプリがあり、ナビゲーションボタンのほんの一部(またはまったくなし)がタイトル付きのシステムボタンである場合、これはあなたのためかもしれません!
(注:長いタイトルによって中央のナビゲーションバーのタイトルがシフトしないようにするために、テキストの色がはっきりしている場合でも、フォントサイズを変更する必要があります)
次のコードをviewDidLoadまたはloadViewに追加します。
self.navigationController.navigationBar.topItem.title = @"";
iOS 9を搭載したiPhoneおよびiPadでテストしました
このObjective-Cカテゴリを追加して、ナビゲーションコントローラーによって作成されたすべての「戻る」ボタンにテキストを設定しないようにすることができます。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バージョンを追加できます)
override
迅速にそれをするか。非常に興味深い質問
上と下のいくつかを試しましたが、うまくいきませんでした。これは私のために働きました:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
副作用なしで機能するのは、カスタムの戻るボタンを作成することだけです。カスタムアクションを提供しない限り、スライドジェスチャーでも機能します。
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
残念ながら、すべての戻るボタンにタイトルを付けたくない場合は、すべてのビューコントローラーでこのカスタムの戻るボタンを設定する必要があります。
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
タイトルとして空の文字列ではなく空白を設定することが非常に重要です。
プログラムでバックボタンからテキストを削除するには、コードの下で使用します。これはxcode7以降で機能します。
self.navigationController.navigationBar.topItem.title = @ "";
または
手動ストーリーボードで、View Controllerのナビゲーションバーを選択し、「」を戻るボタンのテキストに入れます。
これは動作します。ありがとう
self.navigationController?.navigationBar.topItem?.title = " "
Xcode 9で、そして働きました!
現在の答えは機能していませんでした。タイトルを完全に削除したかったのですが、「戻る」というテキストは消えませんでした。
前のビューコントローラーに戻り、そのtitleプロパティを設定します。
self.title = @" ";
以前のView Controllerにタイトルがない場合にのみ機能します
@""
。
別の方法-カスタム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のカスタムクラスを設定するだけです。
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)
}
}
すでに多くの答えがあります。これは私の話題の2セントです。このアプローチは本当に堅牢であることがわかりました。セグエする前にこれをviewControllerに置くだけです。
スウィフト4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
私はこの投稿のすべてを試しました。唯一の有効な解決策は@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)
}
}
これは、iOS11の私の解像度です。applicationDidFinishLaunchingWithOptionsのUIBarButtonItemの外観を変更します。
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Yオフセットは変更できません。iOS11ではバックバーボタンの位置も変更されるためですが、iOS10以下では問題ありません。
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)
// ...
}
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
}
戻るボタンのタイトルをグローバルに非表示にする場合。
あなたはスウィズルできるviewDidLoad
のUIViewController
このような。
+ (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;
}
私はカスタムナビゲーションコントローラーを持っていたため、これに苦労していました。カスタムナビゲーションコントローラークラスのこのコードを使用して、すべてのビューコントローラーのバックアイテムテキストを削除できました
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
これにより、このカスタムナビゲーションコントローラーを使用して、すべてのバックアイテムタイトルが削除されます。
iOS 13以降をターゲットにしている場合は、この新しいAPIを使用して、戻るボタンのタイトルをグローバルに非表示にできます。
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
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];
}
-(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];
}
バックテキストは最後の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(シンプルチャイナセ)をご覧ください。
私の解決策:-XCode:10.2.1-Swift:5
XCode 11.5 Swift 5
カスタムの戻るボタンが必要ない場合にプログラムでこれを行う非常に単純な方法-おそらく少しハッキーですが-スタックにプッシュしているビューコントローラーでフォントサイズをゼロに設定し、次のように呼び出しますviewDidLoadから
private func setupNavBar() {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
appearance.backButtonAppearance = backButtonAppearance
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance
}
次の方法はiOS 11で機能し、他のiOSバージョンでクラッシュしないように安全です。UIModernBarButtonとUIBackButtonContainerViewはどちらもプライベートAPIであるため、これを行うとApp Storeレビューでアプリが拒否される可能性があります。AppDelegateに配置します。
if
let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {
let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
backButton.setTitleColor(.clear, for: .normal)
}
Swiftバージョンは、完全にグローバルに機能します。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
return true
}
solution
。@limfinityが指摘したように、それはアプリ全体のすべてのUIBarButtonItemのために普遍的にそれを変更します