UINavigationControllerから[戻る]ボタンのテキストを非表示にするにはどうすればよいですか?私は「<」のみを持ち、「<Back」は持ちません
インターフェイスビルダーでは、前のコントローラーのナビゲーションアイテムを選択し、Back Button
文字列を[戻る]ボタンの表示に変更できます。 たとえば、空白にする場合は、スペースを入れてください。
変更も可能次のコード行:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
またはSwiftで:
self.navigationItem.backBarButtonItem?.title = ""
ストーリーボードを使用してこれを行うこともできます。 前のコントローラーのナビゲーション項目の属性インスペクターでは、「戻る」ボタンフィールドに「」を設定できます。以下の画像を参照してください。 「ここのタイトル」を「」に置き換えます。これにより、目的の結果を達成できます。もう「タイトル」をいじる必要はありません。
プログラムで使用できます
[self.navigationItem.backBarButtonItem setTitle:@" "];
selfは、目的のViewコントローラーをプッシュするコントローラーを指します。
ナビゲーションバーの前後のサンプル
前
後
次のように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)
これは、ナビゲーションスタックのView Controllerの上にあるView Controllerで実行する必要があります(つまり、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カテゴリを追加して、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バージョンの追加を歓迎します)
プログラムでバックボタンからテキストを削除するには、コードの下で使用します。これはxcode7以降で機能します。
self.navigationController.navigationBar.topItem.title = @ "";
または
ストーリーボードでmanualLyを選択し、View Controllerのナビゲーションバーを選択して、戻るボタンのテキストに「」を入力します。
これは動作します。ありがとう
副作用なしで機能する唯一のものは、カスタムの戻るボタンを作成することです。カスタムアクションを提供しない限り、スライドジェスチャも機能します。
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()
}
空の文字列ではなく、タイトルとして空白を設定することが非常に重要です。
現在の答えはうまくいきませんでした。 タイトルを削除する完全にしたかったのですが、「戻る」というテキストは消えませんでした。
前のView Controllerに戻り、そのtitleプロパティを設定します:
self.title = @" ";
ONLY前のView Controllerにタイトルがない場合に機能する
上記のいくつかを試しましたが、うまくいきませんでした。これは私のために働いた:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
別の方法-カスタム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に入れるだけです。
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
前のVCのタイトルをスペースを含む「」文字列に設定します。 [戻る]ボタンのあるタイトルは、単一のスペース文字列に置き換えられます。
Self.title = " "
戻るボタンをもう一度押すと、viewWillAppearのタイトルが元のタイトルにリセットされます。
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)
// ...
}
これはiOS11の私の解像度です。applicationDidFinishLaunchingWithOptionsのUIBarButtonItemの外観を変更します。
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Yオフセットを変更することはできません。iOS11ではバックバーボタンの位置も変更されるためです。ただし、iOS10以下ではOKです。
戻るボタンのタイトルをグローバルに非表示にする場合。
このように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;
}
最後に、アプリ全体でデフォルトのバックテキストを非表示にする完璧なソリューションを見つけました。
透明な画像を1つ追加し、AppDelegateに次のコードを追加するだけです。
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
私のソリューション:-XCode:10.2.1-Swift:5
カスタムNavigation Controllerがあるため、これに苦労していました。カスタムナビゲーションコントローラークラスoverride func viewDidLayoutSubviews() { self.navigationBar.backItem?.title = "" }
のこのコードを使用して、すべてのView Controllerのバックアイテムテキストを削除できました
これにより、このカスタムNavigation Controllerを使用して、バックアイテムのタイトルがすべて削除されます。
バックテキストは、最後の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)
-(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];
}
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];
}