我正在尝试设置PLUICameraViewController
上“重拍”和“使用”按钮的文字。我以编程方式浏览视图层次结构并找到了几个UIButtonLabel
个对象。记录这些文本显示了我的期望:“重新拍摄”,“取消”等。但是设置文本不起作用。按钮只保留原始文本。这是我尝试过的:
if (q is a subclass of UIButtonLabel)
if ([q respondsToSelector:@selector(setText:)])
[q performSelector:@selector(setText:) withObject:@"zzz"];
代码运行没有崩溃。 responsedsToSelector也返回YES。 如何更新按钮上的文字?
顺便说一下,我知道其他涉及自定义按钮的方法,我自己的观点等等。我从Objective-C / runtime / iOS的角度来看,真的好奇为什么上面的代码不起作用。
另请注意我在
中这样做 navigationController:willShowViewController:viewController:animated:
答案 0 :(得分:4)
在这种情况下,我认为这不是私有API的问题,本身。这就是UIButton
的工作方式。
是的,按钮的标题是UILabel
,实际上,它可能是/当前私有类UIButtonLabel的一个实例。但是,Apple打算让你更改标题文本的方式是使用UIButton
本身的方法:
[self.button setTitle: @"newTitle" forState: UIControlStateNormal];
[self.button setTitle: @"newTitle" forState: UIControlStateSelected];
而不是尝试深入查看按钮的子视图层次结构,找到按钮标签,然后调用setText:
。
Here's the relevant API documentation
至于为什么它不起作用,我想这是因为Apple想要那样。
首先,更改按钮的标题应该是正常的用例。因此,为方便起见,他们可能希望直接在UIButton
界面中为您提供一种简单的方法。如果他们强迫您深入查看视图层次结构,那么您不仅需要编写更多代码,而且还会让Apple更难以更改按钮的底层实现。他们可能希望保留以后更改它的能力,为此,他们最好保留UIButton
级别的某种包装API。
另外,如果你直接更改按钮标签上的文字,你就会绕开他们的设计,标签文字取决于按钮状态(例如正常,突出显示,选择等)甚至虽然大多数人可能对所有状态使用相同的按钮文本,但设计允许依赖于状态的文本,因此隐藏底层UIButtonLabel
有助于强制执行此设计。
这是我对他们动机的猜测。
因此,为了强制执行此操作,完全有可能在UIButtonLabel
setText:
的实现中,他们拒绝在按钮初始化后更新文本。之后,您必须使用setTitle:forState:
方法。