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)
在这种情况下,我认为这本身并不是私有 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:.
至于为什么它不起作用,我想那是因为苹果想要这样。
首先,更改按钮的标题预计是一种正常的用例。因此,为了方便起见,他们可能想为您提供一个直接在UIButton界面中调用的简单方法。如果他们强迫你深入查看视图层次结构,你不仅需要编写更多代码,而且会让 Apple 更改按钮的底层实现变得更加困难。他们可能希望保留以后更改它的能力,为此,他们最好在级别上保留某种包装 API UIButton。
另外,如果您直接更改按钮标签上的文本,则会规避其设计,其中标签文本取决于按钮状态(例如正常、突出显示、选定等)。即使大多数人可能使用相同的按钮文本在所有状态下,设计都允许依赖于状态的文本,因此隐藏底层UIButtonLabel有助于强制执行此设计。
这是我对他们动机的猜测。
因此,为了强制执行此操作,在 的实现中UIButtonLabel setText:,他们完全有可能在按钮初始化后拒绝更新文本。之后,你必须使用该setTitle:forState:方法。
| 归档时间: |
|
| 查看次数: |
2747 次 |
| 最近记录: |