控制台消息的含义是什么:“从ivar布局中咆哮......”?

时间:2011-05-24 16:29:44

标签: iphone cocoa-touch

我的控制台消息似乎是由明显不相关的事件触发的。

消息说明:

  

从ivar布局中咆哮:[propertyName] = [constantString]

其中[propertyName]是我设置字符串常量[constantString]的值的属性的名称。

导致此消息的原因是什么?

3 个答案:

答案 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;
}

但是,请注意:

  

如果您的应用程序包含用户需要与之交互的自定义​​个人视图,则必须使视图可访问。