3

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

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

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

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

另请注意,我正在这样做

 navigationController:willShowViewController:viewController:animated:
4

1 回答 1

5

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

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

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

而不是试图深入到按钮的子视图层次结构中,而是找到一个按钮标签,然后调用setText:.

这是相关的API文档

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

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

此外,如果您直接更改按钮标签上的文本,则您正在规避他们的设计,其中标签文本取决于按钮状态(例如正常、突出显示、选中等),尽管大多数人可能使用相同的按钮文本在所有状态下,该设计都允许依赖于状态的文本,因此,隐藏底层UIButtonLabel有助于实施这种设计。

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

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

于 2013-01-02T01:34:58.010 回答