UISwitch的初始化导致iOS 6中无法识别的选择器异常

时间:2013-11-18 10:18:32

标签: ios objective-c initialization uiswitch

我的视图中有一个UISwitch,我的设备和模拟器上的一切都适用于iOS 7,但是当我在iOS 6模拟器中运行我的应用程序时,我得到了一个奇怪的例外。

异常断点在此特定代码行触发:

self.mySwitch = [[UISwitch alloc] init];

使用以下输出:

-[__NSCFString count]: unrecognized selector sent to instance

这在某种程度上是模拟器中的错误吗?我不知道如何解决这个问题,目前我手边还没有iOS 6设备。

此时相关的堆栈跟踪是:

* thread #1: tid = 0x177e6, 0x0191be52 libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1
frame #0: 0x0191be52 libobjc.A.dylib`objc_exception_throw
frame #1: 0x01d144bd CoreFoundation`-[NSObject(NSObject) doesNotRecognizeSelector:] + 253
frame #2: 0x01c78bbc CoreFoundation`___forwarding___ + 588
frame #3: 0x01c7894e CoreFoundation`_CF_forwarding_prep_0 + 14
frame #4: 0x01c0ab10 CoreFoundation`CFArrayGetCount + 80
frame #5: 0x0106cc04 UIKit`__36-[_UISwitchInternalView _labelImage]_block_invoke_0 + 144
frame #6: 0x010a22fe UIKit`+[UIImage(_UIImageTintedInterfaceExtension) _cachedImageForKey:fromBlock:] + 131
frame #7: 0x0106cb6c UIKit`-[_UISwitchInternalView _labelImage] + 187
frame #8: 0x0106e6ed UIKit`-[_UISwitchInternalView _buildControl] + 1454
frame #9: 0x0106b7c1 UIKit`__39-[_UISwitchInternalView initWithFrame:]_block_invoke_0 + 36
frame #10: 0x00eb240c UIKit`+[UIView(Animation) _performWithoutAnimation:] + 82
frame #11: 0x0106b793 UIKit`-[_UISwitchInternalView initWithFrame:] + 420
frame #12: 0x0106f196 UIKit`-[UISwitch _commonInitNewLook] + 225
frame #13: 0x0106f741 UIKit`-[UISwitch initWithFrame:] + 143
frame #14: 0x0106f6ab UIKit`-[UISwitch init] + 118

编辑:我只使用两次关于UIAppearance的调用,即使我发表评论也会发生崩溃。

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor slubDarkBlue]];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"searchBarIcon"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];

3 个答案:

答案 0 :(得分:0)

这没有多大意义,因为崩溃说明了将消息“count”发送到字符串。这指出悬挂参考的问题。如果您确定崩溃发生在[[UISwitch alloc] init]内,请尝试[[UISwitch alloc] initWithFrame:CGRectZero];

您使用的是任何外观方法吗?

答案 1 :(得分:0)

开发者论坛中的Apple开发人员让我朝着正确的方向前进。事实证明这是一个本地化问题。

我做了:

[myUserDefaults setObject:inAppLanguage forKey:@"AppleLanguages"];

而不是:

[myUserDefaults setObject:@[inAppLanguage] forKey:@"AppleLanguages"];

其中inAppLanguage是一个像@“de”或@“en”的NSString。所以UISwitch遇到了单个NSString而不是NSStrings的NSArray。

答案 2 :(得分:-1)

听起来你正在注射一个NSString,其中应该有一个NSArray或任何可数的东西。

在任何情况下,它肯定不是模拟器错误,所以一定要仔细检查你的代码。它可能在先前的指令或初始化中。甚至可能在你的一个xib文件中。

此外,由于您在iOS 7和6中没有相同的行为,您可能需要检查您可能错过的任何API更改。