- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 iOS 应用程序开发辅助功能项目。因为可访问性并不像宣传的那样有效,所以我必须在子类中覆盖 accessibilityFrame
、accessibilityActivationPoint
和 pointInside:withEvent
以扩展区域由 VoiceOver 识别(用于绘图和触摸识别)超出控件 View 的“自然”边界。因此,为了更改 UIButton
的 VoiceOver 边界,我必须对该类进行子类化,然后添加这三个方法。为了对 UILabel
执行此操作,我必须使用代码添加另一个子类,依此类推。
我可以将这些方法中的代码重构到一个中心位置,但我想知道是否可以通过继承更优雅地完成此操作。我想将此代码放入 UIView
的子类(可能称为 UIViewAccessible
),然后创建 UIButton
的子类,称为 UIButtonAccessible
继承自 UIButton
,后者又继承自 UIViewAccessible
而不是 UIView
。这可能吗,或者类似的事情可以用一个类别来完成吗?
编辑:根据文档,您无法通过类别真正实现此目的:
If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime.
还有其他方法吗?
最佳答案
要回答您的问题,不,它不能,因为您的 UIViewAccessible
是继承链中 UIButton
的二级同级(均继承自 UIView
在某些时候)。但我想你已经知道了。至于解决方案,您可以围绕您的 UIView
可访问类包装一个装饰器,并使用强类型协议(protocol)。这样您就可以将代码保存在一个地方。我已经描述了这种技术 here更详细(虽然目的不同,但情况相同)。
对于支持可访问性的 View ,您必须这样做:
@property (nonatomic, strong) UIView<MyAccesibilityProtocol>* view;
//self.view can come from the nib or previously created in code
self.view = [[AccesibilityDecorator alloc] initWithDecoratedObject:self.view];
//you can then use self.view like any other UIView,
//and because it also implements an
//accessibility protocol, you can use the methods
//implemented in the wrapper as well.
//more than that, you can control which methods to override
//in the AccesibilityDecorator class
[self.view addSubview:otherView];//could be overridden or not
[self.view myAccesibilityMethod];//custom method declared in the protocol
关于ios - B 的子类(从 A 类继承)可以从 A 的子类而不是 A 本身继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150679/
我是一名优秀的程序员,十分优秀!