0
for (int i = 1; i < [[[UILocalizedIndexedCollation currentCollation] sectionTitles] count]+1; i++) {

    HeaderButton *headerLabel = (HeaderButton *)[tileView viewWithTag:i];
}

こんにちは。私はForループを使用して、XIBファイルにあるボタンのグリッドをループしています。英語のローカリゼーションの場合、100%動作し、グリッド内の26個のボタンすべてを検索します。

お気づきの方もいらっしゃると思いますが、私はLocalizedIndexを使用しており、適切な「NUMBER_HERE未満」ステートメントを返します。日本語の場合は<38を返し、37個のボタンすべてが見つかります。

今、奇妙な問題。日本語、スペイン語、さらには中国語のローカリゼーションの同じforループは正しく機能しません。

気がおかしくなりそうだ。NSLogステートメントを挿入しましたが、タグが27までのボタン(日本語の場合は37、スペイン語の場合は30など)が見つかり、28でクラッシュして次のように表示されます。

-[UIView setTitle:forState:]: unrecognized selector sent to instance 0x1dd6b640

UIViewにsetTitle:forState:メソッドがないことは知っています。上記のcastステートメントを使用して、特定のビューにあるButtonサブクラスボタンをポイントしています。私が言ったように、英語の場合、これは100%機能しますが、それ以外の場合は機能しません。

これが起こるべき理由はありません。私のコードは100%正しいです。28のviewWithTagに問題があるように見えるのはXcodeです。

何か案は?

よろしく、ココタッチ

4

1 に答える 1

2

デバッグに使用できるコードと、これを整理したら後で保持できるコードを次に示します。プロジェクトについてあまり知らないので、viewWithTagが予期しないタイプを見つけているように見えます。ブラインドキャストを内省的なテストに置き換えましょう...

for (int i = 1; i < [[[UILocalizedIndexedCollation currentCollation] sectionTitles] count]+1; i++) {

    // let's start out not assuming anything about subviews we find
    UIView *view = [tileView viewWithTag:i];
    if ([view isKindOfClass:[HeaderButton self]]) {
        // now we're sure about what we have
        HeaderButton *headerLabel = (HeaderButton *)view;
        // now we can setTitle:forState: and so on, safely knowing the type
    } else {
        // while we're here, let's find out what was crashing the app
        NSLog(@"look out! view with tag %d is of type %@", i, [view class]);
    }
}
于 2012-11-28T03:43:42.717 に答える