如何禁用出现在 UITabBarController 的“更多”部分中的编辑按钮?
在我的应用程序中(基于选项卡栏应用程序 XCode 模板),我使用 UITabBarController 来显示用户可以访问的应用程序不同部分的列表。
默认情况下,当项目超过 5 个时,UITabBarController 会在选项卡栏中显示“更多”按钮。 此外,它还允许用户选择他希望在选项卡栏中可见的项目。
目前我无法实现保存和加载选项卡栏控制器的状态,所以我想禁用“编辑”按钮。
有没有办法禁用/隐藏 UITabBarController 的“更多”导航控制器上显示的“编辑”栏按钮?
我尝试过:
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;
但
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem.enabled = NO;
它们似乎不起作用。
In my application (based on the Tab bar application XCode template) I use a UITabBarController to display a list of different sections of the application that the user can access.
By default, the UITabBarController displays a 'More' button in the tab bar when there are more than 5 items. Also, it allows the user to select the items that he want to be visible in the tab bar.
Currently I can't implement saving and loading the state of the tab bar controller, so I want to disable the 'Edit' button.
Is there any way to disable/hide the 'Edit' bar button that appears on the 'More' navigation controller of UITabBarController?
I tried:
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;
and
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem.enabled = NO;
but they don't seem to work.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
成为
moreNavigationController
的委托(它是一个 UINavigationController)并添加以下内容:现在它不会出现。 需要考虑的关键是,编辑按钮不是在控制器创建之后出现,而是在显示视图之前出现,我们应该静静地坐着直到那一刻,然后,当控制器要显示屏幕时,我们将按钮敲出,以便它不会有机会再次创建它。 :)
Become a delegate of
moreNavigationController
(it is a UINavigationController) and add this:Now it won't appear. The key thing to consider is that Edit button appears not after controller creation, but before displaying the view, and we should sit silently till that moment and then, when the controller is going to display the screen, we will knock the button out so that it won't have a chance to create it again. :)
customizedViewControllers
是一个数组; 将其设置为空数组以禁用所有编辑。customizableViewControllers
is an array; set it to the empty array to disable all editing.我已经尝试过,这是一个例子。
在 AppDelegate.m 中
删除“编辑”按钮
在 AppDelegate.h 中,
如果我错了,请纠正我。
i have tried and here's a example.
In AppDelegate.m
to remove the "Edit" Button
In your AppDelegate.h
correct me if i'm wrong.
我可以使用以下代码来实现此目的。 我创建了一个
CustomTabViewController
,然后在 Interface Builder 中修改了选项卡栏控制器的类标识以使用此自定义类。 这是它使用的代码(.h 和 .m 文件内容)。 关键是将该属性设置为nil,这会导致“编辑”按钮不显示。 有关详细信息,请参阅: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizingViewControllers“如果数组为空或该属性的值为 nil,则选项卡栏不允许重新排列任何项目。”
I was able to get this working with the following code. I created a
CustomTabViewController
and then modified my Tab Bar Controller's Class Identity in Interface Builder to use this custom class. Here is the code that it uses (.h and .m file contents). The key is setting the property to nil, which causes the Edit button to not be displayed. For details see: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers"If the array is empty or the value of this property is nil, the tab bar does not allow any items to be rearranged."
这可以这样实现。 它不是最优雅的解决方案,但是 It Works™。
This can be achieved like such. It is not the most elegant solution, but It Works™.
只需在生命周期方法中添加一行代码,即应用程序完成启动:
Simply add a line of code in life cycle method i.e. application did finish launching:
@m4rkk & @lan terrell 该代码不起作用。
我无法获得它,所以我完全禁用了导航栏。
@m4rkk & @lan terrell that code does not work.
I wasn't able to get it so I just disable the navigation bar altogether.
我不了解 iOS4,但如果你将代码放在
viewDidLoad
与viewWillAppear
中,这很重要。即,这会起作用。
I don't know about iOS4, but it matters if you put the code in
viewDidLoad
vsviewWillAppear
.Ie., this will work.
如果您使用 NavigationController 作为第一个 ViewController 并按其中一个按钮进入 UITabBarController。 然后,除了添加下面的代码之外,
您还需要添加这个“if 语句”,以避免在您第一次单击第 5 个及以上的 ViewController 时出现编辑按钮。
If you use NavigationController as your 1st ViewController and press one of the button to enter UITabBarController. Then apart from adding the code below,
you need to add this "if statement" to avoid the edit button shows up when you first click the 5th ViewControllers and above.
对于使用 Xcode 4.0 以上的版本(我正在为 Snow Leopard 使用 Xcode 4.2):
首先检查您上次更改视图数组的位置。 我认为用哪种方法将可定制视图数组设置为 nil 并不重要。 苹果的描述说:
它对我有用,所以请尝试一下。
我在这里找到了这个描述: 描述链接在developer.apple.com上的“防止选项卡自定义”一章。
At the ones working with Xcode greater than 4.0 (I'm working on Xcode 4.2 for Snow Leopard):
Check at first where do you change the array of views the last time. I think it doesn't matter in which method you set your customizableView-Array to nil. Apples description says:
It worked for me, so please try it out.
I found this description here: link to the description on developer.apple.com at chapter "Preventing the Customization of Tabs".
iPhone 6 Plus 在横向模式下的标签栏上将允许比纵向模式下更多的按钮。 不幸的是,这意味着每当设备旋转时它都会重置可定制的ViewControllers数组,并且这里的答案都不适合我。
我已经有了自己的 UITabBarController 子类,并且重写可定制视图控制器的 setter 和 getter 方法是从“更多”屏幕中删除“编辑”按钮的唯一可靠方法:
An iPhone 6 Plus will allow more buttons on the tab bar in landscape mode than in portrait. Unfortunately this means it resets the customizableViewControllers array whenever the device is rotated, and none of the answers here worked for me.
I already had my own UITabBarController subclass and overriding the setter and getter methods for customizableViewControllers was the only reliable way to remove the Edit button from the More screen:
这是一个迟到的补充,但我认为这是一个有用的贡献。 Aleks N 的答案可能会造成这样一种情况:“更多选项卡”下的每个视图控制器的 rightBarButtonItem 被删除(如鲍雷提到的)。 我想推荐使用Bao Lei的代码,但不同之处在于它是didShowViewController委托方法的实现。
由于他的代码现在已存在,用户点击“更多”选项卡返回到基本 UIMoreViewController 表可能会导致属于其他 viewController 的 rightBarButtonItem 被设置为 nil。
区别很小,但我花了相当多的时间才发现这个错误。
This is a late addition but I think it is a helpful contribution. Aleks N's answer can create a situation where the rightBarButtonItem is removed for every view controller under the "More Tab" (as Bao Lei mentioned). I would like to recommend using Bao Lei's Code, but with the difference of implenting it it the didShowViewController delegate method.
As his code exists now, users tapping the "More" tab to return to the base UIMoreViewController table can cause rightBarButtonItem's belonging to other viewControllers to be set to nil.
The distinction is small but it took me a considerable amount of time to find this bug.
Aleks N 的答案有效,但我想稍微修改一下,
因为每次在该视图堆栈上推送或弹出视图控制器时都会调用此委托方法。 当我们将其他视图推送到这个“更多”视图控制器时,我们不想这样做。
Aleks N's answer works, but I'd like to modify a little bit
Since this delegate method is called every time when a view controller is pushed or popped on this view stack. When we are pushing other views onto this "More" view controller, we don't want to do this.
唯一对我有用的解决方案
The only solution that worked for me
我尝试了大部分解决方案,但遇到了旋转设备时编辑按钮会返回的问题。 旋转将重置回第一个视图控制器,然后当我返回到更多视图控制器时,编辑按钮就在那里。 最好的解决方案是成为
UITabBarControllerDelegate
并在 more 视图控制器成为所选视图控制器时将右侧栏按钮设置为 nil。 这适用于 iOS 11-12。I tried most of these solutions and was running into an issue where the edit button would return when rotating the device. The rotation would reset back to the first view controller, then when i returned to the more view controller, the edit button was there. The best solution was to become the
UITabBarControllerDelegate
and set the right bar button to nil anytime the more view controller became the selected view controller. This is working for iOS 11-12.