我正在尝试设置 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/