2011-05-24 24 views
5

我有一個控制檯消息似乎是由顯然不相關的事件觸發的。控制檯消息的含義是什麼:「從伊娃佈局中得到snarfed ...」?

該消息指出:

從的ivar佈局snarfed:將[PropertyName] = [constantString]

[propertyName]是一個屬性的名稱,其餘設置的字符串常量的值[constantString]

什麼原因導致此消息,這是什麼意思?

+0

你試過設置一個斷點嗎? – justin 2011-05-25 01:14:42

+0

我無法理解生成聲明的內容。我使用該字符串來構建用於提供圖層內容的圖像的路徑。然而,當我設置內容但我在該圖層上設置動畫時,日誌不會顯示。 – Fabio 2011-05-25 19:55:53

+0

我遇到了與我的自定義UITableViewCell相同的問題。奇怪的行爲,我還不知道爲什麼這個消息出現。 – Klaas 2011-06-02 23:59:46

回答

7

我最近也遇到過這個問題。我能夠解決我的具體問題,但我不認爲這正是提問者遇到的問題,因爲我的問題只是在VoiceOver模式下公開。因此,我會提供有關我認爲正在發生的事情的想法,然後我會談談我的具體問題。

至於一般問題,我認爲蘋果框架決定查看特定類的所有ivars以提取它想要的一些信息,但這不是由UI的其他部分提供的元件。這對我來說似乎有些古怪,但那是我遇到的。

因此,繼續一般情況下,並在回答最初的問題。如果你和我一樣,那麼你的財產名稱可能與你的伊娃相同。嘗試明確定義該屬性的getter方法。然後,如果要返回非零值,則在該getter中設置一個斷點。看看堆棧跟蹤,這應該告訴你哪一個蘋果框架決定循環你的伊娃佈局,以獲得它想要的信息。 (如果您的財產和伊娃沒有使用相同的名稱,那麼只需使用伊娃名稱定義一個屬性和getter,並使用斷點執行相同的操作。)

我的具體情況是針對自定義表格單元格(如其中一個評論者)。在那個牢房裏,我有一個和伊娃相同的名字。我也有一個明確定義的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線,這表明我從輔助功能的堆棧跟蹤。 stacktrace顯示了我的方法被Apple內部方法調用,該方法循環遍歷我的所有ivars,尋找可用作我的表格單元格的accessibilityLabel的東西。選擇器的名稱是'_accessibilityRetrieveTableViewIvarsText'。

爲了讓事情變得更糟,在我的情況中,這不僅僅是一個調試器問題,它通過使用accessibilityLabel將錯誤的事物搞亂了我的Accessibility接口。

我想出了3個修復我的具體問題:

1)我加了一個價值爲accessibilityLabel的筆尖內的表格單元格。這滿足了蘋果框架,以至於它沒有通過我的ivars進行搜索。然而,這不是我所用的解決方案,因爲我不需要靜態可訪問標籤。

2)我使用一個空的實現和接口繼承了我的CustomTableViewCell,並將它用作Nib中的Table單元類。這解決了這個問題,因爲Apple Framework通過了那個類的ivars,其中沒有任何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 ; 
} 

這解決了這一問題,因爲零返回時,蘋果公司檢查伊娃,和,因此,沒有什麼是「snarfed」。我仍然不確定這是否合適。

+0

非常感謝!你的建議讓我朝着正確的方向前進。我將添加一些答案,以供將來參考。 – Fabio 2011-06-04 13:53:15

2

供將來參考。該消息由可訪問性框架記錄,顯然通過UIView ivars查找字符串。

如果你在下面的鏈接中指定自定義子類可以定義自定義屬性: Accessibility Programming Guide

或者你可以讓不可訪問的視圖子類:

- (BOOL)isAccessibilityElement 
{ 
    return NO; 
} 

但是,請注意:

如果您的應用程序包含用戶需要與之交互的自定義​​單獨視圖,則必須使該視圖可訪問。

3

「ivarfed from ivar」基本上自動填充您的accessibilityLabel。如果你自己這樣做,消息就會消失,因爲不再需要對你的UITableViewCell進行打掃。