在PLUICameraViewController上设置UIButtonLabel上的文本

时间:2012-12-27 21:48:13

标签: objective-c ios uilabel iphone-privateapi

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

1 个答案:

答案 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:方法。