objective-c - 在 PLUICameraViewController 上设置 UIButtonLabel 上的文本

标签 objective-c ios uilabel iphone-privateapi

我正在尝试设置 PLUICameraViewController 上“Retake”和“Use”按钮的文本。我以编程方式浏览了 View 层次结构并找到了一些 UIButtonLabel 对象。记录这些文本显示了我的期望:“重拍”、“取消”等。但是设置文本不起作用。这些按钮只保留其原始文本。这是我尝试过的:

if (q is a subclass of UIButtonLabel)
    if ([q respondsToSelector:@selector(setText:)])
        [q performSelector:@selector(setText:) withObject:@"zzz"];

代码运行时不会崩溃。 respondsToSelector 也返回 YES。 如何更新按钮上的文字?

顺便说一句,我知道涉及自定义按钮、我自己的 View 等的其他方法。从 Objective-C/运行时/iOS 的角度来看,我真的很好奇为什么上面的代码不起作用。

另请注意,我在

 navigationController:willShowViewController:viewController:animated:

最佳答案

在这种情况下,我认为这不是私有(private) API 的问题,本身。这正是 UIButton 的工作方式。

是的,按钮的标题是一个UILabel,实际上,它可能/当前是私有(private)类UIButtonLabel 的实例。 .但是,Apple 打算让您更改标题文本的方式是使用 UIButton 本身的方法:

[self.button setTitle: @"newTitle" forState: UIControlStateNormal];
[self.button setTitle: @"newTitle" forState: UIControlStateSelected];

与其尝试深入了解按钮的 subview 层次结构,不如找到按钮标签,然后调用 setText:

Here's the relevant API documentation

至于为什么它不起作用,我想那是因为 Apple 希望那样。

首先,更改按钮的标题应该是一个正常的用例。因此,为了方便起见,他们可能想为您提供一种直接在 UIButton 界面中调用的简单方法。如果他们强制您深入查看 View 层次结构,您不仅需要编写更多代码,而且会让 Apple 更难更改按钮的底层实现。他们可能希望保留以后更改它的能力,为此,他们最好在 UIButton 级别保留某种包装器 API。

此外,如果您直接更改按钮标签上的文本,您就是在规避他们的设计,其中标签文本取决于按钮的状态(例如正常、突出显示、选中等)甚至尽管大多数人可能对所有状态使用相同的按钮文本,但该设计允许使用状态相关的文本,因此隐藏底层 UIButtonLabel 有助于加强此设计。

这是我对他们动机的猜测。

因此,为了强制执行此操作,完全有可能在他们的 UIButtonLabel setText: 实现中拒绝在按钮初始化后更新文本。之后,您必须使用 setTitle:forState: 方法。

关于objective-c - 在 PLUICameraViewController 上设置 UIButtonLabel 上的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14061742/

相关文章:

c++ - 你能帮我将 b2Vec2 存储在 NSArray 中吗?

c# - 如何覆盖 Xamarin.IOS UIButton 的 LayoutSublayersOfLayer 行为?

ios - UILabel 约束可以同时具有最小和最大高度吗?

objective-c - 如何根据我们拥有的文本设置 UILabel 的高度

ios - 如何使用 OpenCV 在 iOS 应用程序中检测面部侧 View 左耳、侧 View Nose 、侧 View 嘴?

iOS 自动布局约束 : ignore hidden or zero-size view?

ios - iphone 5 视网膜显示屏

ios - 如何以编程方式在 iOS 中并排制作两个 UILabel

ios - UISlider 导致水平滚动

javascript - 在 startPage 方法上从 Objective C 获取 HTML5 本地存储项