2017-05-15 6 views
1

AppleのTicTacToe sample projectでは、AAPLTicTacToeBoardView classNSAccessibilityGroupプロトコルに準拠しています。 -accessibilityChildrenの必須実装では、3x3 = 9ボードの四角形を表す9人の子供の配列は、最初の呼び出しでのみ作成されます。それはまた、象牙にキャッシュされます。その後の呼び出しでは、キャッシュされたivarが返されます。macOS:アクセシビリティグループ

TicTacToeは多少特殊なケースです。例えば、私が取り組んでいるタグクラウドなどの他のアプリケーションでは、各呼び出しで子供の配列が異なる可能性があります。したがって、呼び出しごとに、ivarへのキャッシュなしで再作成する必要があります。

TicTacToeの例では、このivar /キャッシングがパフォーマンスのためだけであると想定しています。したがって、私はちょうどAAPLTicTacToeBoardView.mライン177、すべての呼び出しで子供たちを再作成することを強制

if (_accessibilityChildren == nil) 

を削除した場合、私はすべてが多分ちょうどいつの間にか遅く、作業を継続する必要があります期待しています。

代わりに、この行を削除すると動作が壊れることがわかりました。ユーザーがQuickNavでゲームボードにナビゲートすると、accessibilityChildrenがまだ繰り返し呼び出されているにもかかわらず、VoiceOverに「グループは空です」と表示され、呼び出しごとに9つの新しい要素が追加されますが9つの要素が返されます。

明らかに問題を引き起こす新しい要素です。 -accessibilityChildrenを修正して、元の要素の4つ、および他の5つの要素のコピーを含むキャッシュされた配列のコピーを返すと、VoiceOverはゲームボードに「4個のアイテム」が含まれていることを示し、QuickNavは4コピーで表される四角形をスキップして、元のアイテムで表される四角形を作成します。あなた自身のためにそれを参照したい場合は、次のように-accessibilityChildrenreturn _accessibilityChildren;)の最後の行を置き換える:

NSMutableArray* answer = [NSMutableArray new]; 
NSInteger i = 0; 
for (AAPLTicTacToeSquareAccessibilityElement* element in _accessibilityChildren) { 
    /* AAPLTicTacToeSquareAccessibilityElement does not conform to 
    NSCopying, so we copy properties "manually". */ 
    AAPLTicTacToeSquareAccessibilityElement* copy = [[AAPLTicTacToeSquareAccessibilityElement alloc] initWithRow:element.row 
                              column:element.column 
                             delegate:self.delegate]; 
    copy.accessibilityParent = self; 
    copy.accessibilityFrameInParentSpace = element.accessibilityFrameInParentSpace; 
    if (i%2 == 0) { 
     [answer addObject:copy]; 
    } 
    else { 
     [answer addObject:element]; 
    } 
    i++; 
} 

return answer; 

私の質問:なぜ?そして、グループ要素を変更している私の実際のアプリではどうなりますか?

答えて

0

Appleのドキュメントでは見つけられませんが、これに対する答えは - [AAPLTicTacToeBoardView accessibilityChildren]の実装でのコメントによって暗示されています。

// hold onto the accessibility elements the entire time they are shown in the UI 

これは私の質問に記載されているアクセシビリティ要素ではなく、クラッシュではないという結果になると思います。しかし何らかの理由で、要素をivarにキャッシュし、-accessibilityChildrenを呼び出すたびに変更されていない要素を再利用するために少し面倒なコードを追加して、問題を解決しました。 1つは、要素が追加または削除されたときに競合状態によって何らかの問題が発生するかどうか疑問に思うが、うまくいくと思われる。

このコードは、誰かが興味がある場合は、this fileの - [RPTokenControl accessibilityChildren]を参照してください。