我的控制台消息似乎是由明显不相关的事件触发的。
消息说明:
从ivar布局中咆哮:[propertyName] = [constantString]
其中[propertyName]
是我设置字符串常量[constantString]
的值的属性的名称。
导致此消息的原因是什么?
答案 0 :(得分:7)
我最近也遇到过这个问题。我能够解决我的具体问题,但我不认为这正是提问者遇到的问题,因为我的问题只是在VoiceOver模式中公开。因此,我会就我认为通常发生的事情提出想法,然后我会谈谈我的具体问题。
至于一般性问题,我认为Apple Framework决定查看特定类的所有ivars,以便提取它想要的一些信息,但UI元素的其他部分不提供这些信息。 。这对我来说有点奇怪,但这就是我遇到的。
所以,继续一般情况,并回答最初的问题。如果你像我一样,那么你的房产名称可能与你的ivar相同。尝试显式定义该属性的getter方法。然后,如果要返回非零值,则在该getter中设置断点。看看堆栈跟踪,它应该告诉你哪个苹果框架决定循环你的ivar布局,以获得它想要的信息。 (如果你没有为你的属性和ivar使用相同的名称,那么只需使用ivar名称定义属性和getter,并使用断点执行相同的操作。)
我的具体案例是自定义表格单元格(就像其中一个评论者)。在那个单元格中,我有一个与其ivar同名的属性。我还为该属性明确定义了getter。我还从Nib文件中引用了自定义表格单元格。所以,它看起来像这样:
class CustomTableViewCell:UITableViewCell
{
NSString *s ;
}
@property(nonatomic,retain) NSString *s ;
并在实施中:
@synthesize s ;
-(NSString *)s
{
if( !s )
return self.reuseIdentifer ;
return s ;
}
我在返回self.reuseIdentifier行中放置了一个断点,它向我展示了Accessibility函数的堆栈跟踪。堆栈跟踪显示我的方法由Apple内部方法调用,该方法循环遍历我的所有ivars,寻找用作我的表格单元格的accessibilityLabel的东西。选择器的名称是'_accessibilityRetrieveTableViewIvarsText'。
更糟糕的是,在我的情况下,这不仅仅是一个调试器问题,它通过使用错误的东西作为accessibilityLabel来搞乱我的Accessibility接口。
我为我的具体问题想出了3个修复程序:
1)我为Nib中的表格单元格添加了accessibilityLabel的值。这使得Apple框架无法通过我的ivars进行搜索。然而,这不是我使用的解决方案,因为我不想要静态可访问性标签。
2)我使用空实现和接口将CustomTableViewCell子类化,并将其用作Nib中的Table单元类。这解决了这个问题,因为Apple框架循环通过该类的ivars,其中没有,并且没有任何值'snarf'。我也没有使用该解决方案,但它可能是最好的解决方案,因为它使Apple的框架不会检查我的ivars。
3)我决定使用的解决方案是将我的ivar设为私有,并使用不同的名称定义属性。这似乎是许多人使用属性的标准方式。这就是它的样子:
class CustomTableViewCell:UITableViewCell
{
@private
NSString *_s ;
}
@property(nonatomic,retain) NSString *s ;
并在实施中:
@synthesize s = _s ;
-(NSString *)s
{
if( !_s )
return self.reuseIdentifer ;
return _s ;
}
这解决了这个问题,因为当Apple检查ivar时会返回nil,因此,没有任何东西是“snarfed”。我还不确定这个或#2是否更合适。
答案 1 :(得分:3)
“从ivar咆哮”基本上自动填充您的accessibilityLabel。如果您自己这样做,消息就会消失,因为不再需要在您的UITableViewCell中进行攻击。
答案 2 :(得分:2)
供将来参考。该消息由可访问性框架记录,显然通过UIView ivars查找字符串。
如果您有自定义子类,则可以按以下链接中的指定定义自定义属性: Accessibility Programming Guide
或者,您可以使视图子类不可访问:
- (BOOL)isAccessibilityElement
{
return NO;
}
但是,请注意:
如果您的应用程序包含用户需要与之交互的自定义个人视图,则必须使视图可访问。