iOS7でUser Defined Runtime Attributesを使う時の注意

Story BoardではUser Defined Runtime Attributesを用いて独自プロパティを設定することができます。

このとき、+ボタンで追加されるプロパティは初期状態ではkeyPath:Boolean = trueという値になっているかと思いますが、この値は意味のない値になります。

iOS8ではUser Defined Runtime Attributesに無意味な値を入れても問題ないのですが、iOS7では無意味な値が入っているとクラッシュしてしまいます。

もしNSUnknownKeyExceptionというエラーでクラッシュした場合はこれを疑ってみるといいでしょう。

エラーメッセージはたとえば以下の様なものになります。

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<TestProject.TestButton 0x7ae7d860> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.'
*** First throw call stack:
(
    0   CoreFoundation                      0x034eb1e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x037708e5 objc_exception_throw + 44
    2   CoreFoundation                      0x0357afe1 -[NSException raise] + 17
    3   Foundation                          0x011c7d9e -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] + 282
    4   Foundation                          0x011341d7 _NSSetUsingKeyValueSetter + 88
    5   Foundation                          0x01133731 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 267
    6   UIKit                               0x01e53508 -[UIView(CALayerDelegate) setValue:forKey:] + 168
    7   Foundation                          0x01195b0a -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 412
    8   UIKit                               0x02392864 -[UINibKeyValuePair apply] + 70
    9   libobjc.A.dylib                     0x037827de -[NSObject performSelector:] + 62
    10  CoreFoundation                      0x034e676a -[NSArray makeObjectsPerformSelector:] + 314
    11  UIKit                               0x02099d31 -[UINib instantiateWithOwner:options:] + 1389
    12  UIKit                               0x01ed0db0 -[UITableView _dequeueReusableViewOfType:withIdentifier:] + 370
......

参考