AppleのTicTacToe sample projectでは、AAPLTicTacToeBoardView classはNSAccessibilityGroup
プロトコルに準拠しています。 -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コピーで表される四角形をスキップして、元のアイテムで表される四角形を作成します。あなた自身のためにそれを参照したい場合は、次のように-accessibilityChildren
(return _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;
私の質問:なぜ?そして、グループ要素を変更している私の実際のアプリではどうなりますか?