设置 PLUICameraViewController 上 UIButtonLabel 上的文本

MrD*_*ase 3 objective-c iphone-privateapi uilabel ios

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

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

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

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

另请注意,我正在这样做

 navigationController:willShowViewController:viewController:animated:
Run Code Online (Sandbox Code Playgroud)

Nat*_*ate 5

在这种情况下,我认为这本身并不是私有 API 的问题。这就是可行的方法UIButton

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

[self.button setTitle: @"newTitle" forState: UIControlStateNormal];
[self.button setTitle: @"newTitle" forState: UIControlStateSelected];
Run Code Online (Sandbox Code Playgroud)

不要尝试深入了解按钮的子视图层次结构,而是找到按钮标签并调用setText:.

这是相关的API文档

至于为什么它不起作用,我想那是因为苹果想要这样。

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

另外,如果您直接更改按钮标签上的文本,则会规避其设计,其中标签文本取决于按钮状态例如正常、突出显示、选定等)。即使大多数人可能使用相同的按钮文本在所有状态下,设计都允许依赖于状态的文本,因此隐藏底层UIButtonLabel有助于强制执行此设计。

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

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