-2

iOS7対応のiPadアプリを作っています。アプリは iOS 6 では問題なく動作しますが、iOS 7 ではクラッシュします。

if ([self.exercise.variant isEqualToString:kVariantGFTextItem]) {

            NSLog(@"item:%@",[[[itemArray objectAtIndex:0] superview]superview]);

            GapsFillItem *itemView = (GapsFillItem*)[[[[itemArray objectAtIndex:0] superview]superview]subviews];
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
            {
                itemView = (GapsFillItem*)[[[itemArray objectAtIndex:0] superview]superview];
            }

            [itemView.buttonPlaySound setImage:(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?kImageButtonSoundPerItemPad:kImageButtonSoundPerItemPhone forState:UIControlStateNormal];
            itemView.buttonPlaySound.userInteractionEnabled = YES;
        }

このコードは iOS 6 では完全に機能しますが、iOS 7 では機能しません。

クラッシュログは次のとおりです。

    2013-10-19 09:41:53.208 Elementary[645:a0b] item:<TextViewWithTextField: 0xa9e3800; baseClass = UITextView; frame = (183 -10; 562 92); text = 'Hello. Can I  +change+   ...'; clipsToBounds = YES; gestureRecognizers = <NSArray: 0xa7a8170>; layer = <CALayer: 0xa7a7ef0>; contentOffset: {0, 0}>
2013-10-19 09:41:53.209 Elementary[645:a0b] -[__NSArrayM buttonPlaySound]: unrecognized selector sent to instance 0xa7ac9a0
2013-10-19 09:41:53.212 Elementary[645:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM buttonPlaySound]: unrecognized selector sent to instance 0xa7ac9a0'
*** First throw call stack:
(
    0   CoreFoundation                      0x02a435e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x027178b6 objc_exception_throw + 44
    2   CoreFoundation                      0x02ae0903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x02a3390b ___forwarding___ + 1019
    4   CoreFoundation                      0x02a334ee _CF_forwarding_prep_0 + 14
    5   Elementary                          0x00066185 -[GapsFill checkAnswers] + 4693
    6   Elementary                          0x00011bd4 -[ParentViewController checkToolMenuItemTapped] + 228
    7   Elementary                          0x0002da45 -[ToolsMenu menuItemTapped:] + 565
    8   libobjc.A.dylib                     0x02729874 -[NSObject performSelector:withObject:withObject:] + 77
    9   UIKit                               0x00f1dc8c -[UIApplication sendAction:to:from:forEvent:] + 108
    10  UIKit                               0x00f1dc18 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
    11  UIKit                               0x010156d9 -[UIControl sendAction:to:forEvent:] + 66
    12  UIKit                               0x01015a9c -[UIControl _sendActionsForEvents:withEvent:] + 577
    13  UIKit                               0x01014d4b -[UIControl touchesEnded:withEvent:] + 641
    14  UIKit                               0x00f5b0cd -[UIWindow _sendTouchesForEvent:] + 852
    15  UIKit                               0x00f5bd34 -[UIWindow sendEvent:] + 1232
    16  UIKit                               0x00f2fa36 -[UIApplication sendEvent:] + 242
    17  UIKit                               0x00f19d9f _UIApplicationHandleEventQueue + 11421
    18  CoreFoundation                      0x029cc8af __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    19  CoreFoundation                      0x029cc23b __CFRunLoopDoSources0 + 235
    20  CoreFoundation                      0x029e930e __CFRunLoopRun + 910
    21  CoreFoundation                      0x029e8b33 CFRunLoopRunSpecific + 467
    22  CoreFoundation                      0x029e894b CFRunLoopRunInMode + 123
    23  GraphicsServices                    0x035b79d7 GSEventRunModal + 192
    24  GraphicsServices                    0x035b77fe GSEventRun + 104
    25  UIKit                               0x00f1c94b UIApplicationMain + 1225
    26  Elementary                          0x00002285 main + 181
    27  Elementary                          0x000021c5 start + 53
)
libc++abi.dylib: terminating with uncaught exception of type NSException

どうしてこうなったのかわかる方いましたらお願いします。私にお知らせください。

4

1 に答える 1

3

itemViewタイプ であることを期待しているように見えるあなたGapsFillItemの は、実際には タイプNSArrayです。

これは、クラッシュ レポートがNSArrayという名前のセレクターを認識しないことを示しているためです。これは、クラスbuttonPlaySoundで定義されていると想定しています。GapsFillItem

がどのように になっているのNSLogかを理解するために、いくつかのステートメントをそこに入れることをお勧めします。itemViewNSArray

一般に、次のような行は非常に疑わしいものです。

GapsFillItem *itemView = (GapsFillItem*)[[[[itemArray objectAtIndex:0] superview]superview]subviews];

itemView = (GapsFillItem*)[[[itemArray objectAtIndex:0] superview]superview];

これらの 2 つの行の 1 つが問題の場所です。サブビューなどのスーパービューの呼び出しを介してオブジェクトにアクセスすることは避けることをお勧めします。この種のチェーンを介して何かに到達する必要がある場合は、おそらくより良い方法があります。

幸運を祈ります

編集

一見すると、次の行が原因で、これは常に iPad でクラッシュするように見えます。

GapsFillItem *itemView = (GapsFillItem*)[[[[itemArray objectAtIndex:0] superview]superview]subviews];

サブビューは配列です。これはあなたの問題です。おそらく、itemView をサブビュー内のアイテムに設定するつもりです。

とはいえ、クラッシュはデバイス固有のものであり、iOS 7 とは関係がない可能性があります。

于 2013-10-19T04:29:38.263 に答える