我有一个带有单个 UIViewController 的单触摸测试应用程序。我想添加 3 个 UIBarButtonItems
UIBarButtonItem b1 = new UIBarButtonItem(UIBarButtonSystemItem.Action);
UIBarButtonItem b2 = new UIBarButtonItem(UIBarButtonSystemItem.Add);
UIBarButtonItem b3 = new UIBarButtonItem(UIBarButtonSystemItem.Bookmarks);
this.NavigationItem.SetRightBarButtonItems(new [] {b1,b2,b3}, true);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它们出现的顺序错误。首先我看到 b3,然后是 b2,最后是 b1。我想要实现的目标是让 UIBarButtonItems 按以下顺序出现 b1、b2、b3。
难道我做错了什么?
你好 StackOverflow 社区,
我有一个相当奇怪的情况,导航控制器的导航栏上的自定义后退按钮在交互时消失。
一些附加信息是我的代码没有使用 Storyboard,而是使用 UIKit - 包括 UI 在内的所有内容都是以编程方式构建的。
这是我的设置:
我首先创建一个自定义 UINavigationController 子类,以抽象出所有与导航控制器相关的自定义项
在这个子类中,我有一个被调用的方法来自定义后退按钮的外观
private func customizeBackButton() {
let backImage = UIImage(named: "BackButton")?.withRenderingMode(.alwaysOriginal)
navigationBar.backIndicatorImage = backImage
navigationBar.backIndicatorTransitionMaskImage = backImage
UIBarButtonItem.appearance().setTitleTextAttributes([
NSAttributedString.Key.foregroundColor: UIColor.panoStoryYellow,
NSAttributedString.Key.font: UIFont(name: "Montserrat-SemiBold", size: 15)!
], for: .normal)
}
Run Code Online (Sandbox Code Playgroud)
当我在标签消失后点击后退箭头时,它会起作用并将我带回到上一个屏幕,但是,为什么会发生这种消失呢?
我尝试过什么 我尝试过许多关于堆栈溢出的建议,例如:
我可以确认这些不是问题,因为我有有效的标题并且从不隐藏后退按钮。
以下是我在确定它们都不适合我的情况之前检查过的一些资源,我在这里提出了问题:
UINavigationController 后退按钮不可见,但可以使用
UINavigationController的后退按钮消失了?
连续推送 ViewController 时缺少导航或后退按钮的标题
关于为什么这个后退按钮文本消失的任何想法?
我有一个UIToolbar需要三个无线电样式的按钮,这意味着三个按钮,一次只能按一个按钮.该文档提到了在width属性的类引用定义中设置无线电UIBarButtonItems的可能性:
如果此属性值为正,则组合图像和标题的宽度是固定的.如果值为0.0或负值,则该项目将组合图像和标题的宽度设置为适合.如果样式使用无线电模式,则忽略此属性.默认值为0.0.
但是,我在UIKit框架参考中找到了"无线电",我找不到任何以无线电方式提到的UIBarButtonItems.我知道我可以使用TabBar作为无线电接口,但TabBar与我的UI(普通按钮+单选按钮)的用途并不完全相符.我看到日历应用程序在无线电样式(List,Day,Month)中使用UIBarButtonItems,所以看起来这应该在API中的某个地方并由HIG批准.这隐藏在某处还是我必须使用自定义视图创建UIBarButtonItems?
我有一个UITableViewController内心UINavigationController.我正在设置rightBarButtonItem编辑按钮:
self.navigationItem.rightBarButtonItem = self.editButtonItem;
Run Code Online (Sandbox Code Playgroud)

这很好用,在我打电话后tableView:commitEditingStyle:forRowAtIndexPath:我用编程方式改变了我tableView的编辑模式:
[self.tableView setEditing:NO animated:YES];
Run Code Online (Sandbox Code Playgroud)
这里奇怪的是,barButtonItem仍然似乎处于"编辑模式",因为它仍然像我在编辑模式时那样"完成".单击它会将按钮更改回"编辑",然后我必须单击"再次"以将其恢复为编辑模式.

为什么不barButtonItem从编辑模式改变?
虽然我的应用程序运行一个简短的动画,但我不希望用户能够点击任何内容.在我的视图控制器中我可以使用
self.view.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)
阻止大多数交互,但它不会阻止工具栏/导航栏中的按钮触发事件.
我不能只是禁用按钮,因为这会产生令人分心的视觉冲击(按钮呈灰色).
我怎样才能暂停与所有控件的交互?
在viewDidLoad中: - (void)viewDidLoad {[super viewDidLoad];
[self.navigationController setNavigationBarHidden:YES animated:NO];
UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
NSMutableArray *toolBarItems = [[NSMutableArray alloc] init];
[toolBarItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"Articles" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonTapped)]];
[toolBarItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"Source" style:UIBarButtonItemStyleBordered target:self action:nil]];
[toolBarItems addObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]];
[toolBarItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"Aa" style:UIBarButtonItemStyleBordered target:self action:nil]];
[toolBarItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"Rabbit" style:UIBarButtonItemStyleBordered target:self action:nil]];
[toolBar setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
toolBar.items = toolBarItems;
[self.view addSubview:toolBar];
Run Code Online (Sandbox Code Playgroud)
方法:
- (void)backButtonTapped {
[self.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
我在方法内部的调用上有一个断点但它永远不会被调用.为什么这种方法永远不会被调用?
我用barbutton创建了如下视图
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"settingsicon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(settingsButtonClicked:)];
Run Code Online (Sandbox Code Playgroud)

它是这样的,但我想要它

如何删除按钮的边框?
我想将其添加UIBarButtonItem到几个UIViewControllers中.我之前通过创建一个UIViewController设法添加UIBarButtonItems 的父级来完成此操作viewDidLoad.但是现在我有许多视图控制器从不同的视图控制器继承,所以如果我遵循相同的策略,我应该UIViewController为每个不同的视图控制器创建一个子类.
我实际上做的是在我BaseViewController的所有其余的父控制器中配置导航栏按钮,具体取决于我在创建子视图控制器时设置的标志.使用此解决方案,代码只依赖于一个视图控制器,但我想如果有更多优雅的选项来实现这一点.
uinavigationbar uiviewcontroller uinavigationcontroller uibarbuttonitem ios
我有一个嵌入导航控制器的MainViewController,如下所示:

在MainViewController.swift中,我以编程方式添加了两个UIBarButtonItem(左和右):
class MainViewController: UIViewController {
let rightButton = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(onRightClick))
let leftButton = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(onLeftClick))
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = rightButton
navigationItem.leftBarButtonItem = leftButton
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@objc func onRightClick() {
print("[Main] Right Click")
}
@objc func onLeftClick() {
print("[Main] Left Click")
}
}
Run Code Online (Sandbox Code Playgroud)
按钮确实显示在屏幕上,但有趣的是,选择器功能onLeftClick,onRightClick每当我按下向左或向右按钮时都不会被调用.我有什么办法让它有效吗?我正在使用Xcode 9.3.
uibarbuttonitem ×10
ios ×8
cocoa-touch ×4
swift ×3
iphone ×2
objective-c ×2
uikit ×2
selector ×1
uitableview ×1
uitoolbar ×1
uiview ×1
xamarin.ios ×1