テーブルビュー用のカスタムテーブルセルビューを作成しています。 (ストーリーボード内の)カスタムセルの画像ビューをSwiftのコードに接続すると、次のエラーが表示されます。
[UITableViewCellContentView image]: unrecognized selector sent to instance 0x7fb4fad7fd20'
*** First throw call stack:
(
0 CoreFoundation 0x000000010ccbb3f5 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010e7e9bb7 objc_exception_throw + 45
2 CoreFoundation 0x000000010ccc250d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010cc1a7fc ___forwarding___ + 988
4 CoreFoundation 0x000000010cc1a398 _CF_forwarding_prep_0 + 120
5 UIKit 0x000000010d7d8881 -[UITableViewCell _marginWidth] + 151
6 UIKit 0x000000010d7ca23d -[UITableViewCell _separatorFrame] + 70
7 UIKit 0x000000010d7ca6fa -[UITableViewCell _updateSeparatorContent] + 360
8 UIKit 0x000000010d7d4e85 -[UITableViewCell _setSectionLocation:animated:forceBackgroundSetup:] + 1174
9 UIKit 0x000000010d634ea8 __53-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke + 1822
10 UIKit 0x000000010d5b5eae +[UIView(Animation) performWithoutAnimation:] + 65
11 UIKit 0x000000010d63477b -[UITableView _configureCellForDisplay:forIndexPath:] + 312
12 UIKit 0x000000010d63bcec -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 533
13 UIKit 0x000000010d61b7f1 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2846
14 UIKit 0x000000010d63165c -[UITableView layoutSubviews] + 213
15 UIKit 0x000000010d5be199 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
16 QuartzCore 0x00000001114b6f98 -[CALayer layoutSublayers] + 150
17 QuartzCore 0x00000001114abbbe _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
18 QuartzCore 0x00000001114aba2e _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
19 QuartzCore 0x0000000111419ade _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242
20 QuartzCore 0x000000011141abea _ZN2CA11Transaction6commitEv + 390
21 QuartzCore 0x000000011141b255 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89
22 CoreFoundation 0x000000010cbf0347 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
23 CoreFoundation 0x000000010cbf02a0 __CFRunLoopDoObservers + 368
24 CoreFoundation 0x000000010cbe60d3 __CFRunLoopRun + 1123
25 CoreFoundation 0x000000010cbe5a06 CFRunLoopRunSpecific + 470
26 GraphicsServices 0x0000000110daa9f0 GSEventRunModal + 161
27 UIKit 0x000000010d545550 UIApplicationMain + 1282
28 TestWork 0x000000010caa432e top_level_code + 78
29 TestWork 0x000000010caa436a main + 42
30 libdyld.dylib 0x000000010efc3145 start + 1
31 ??? 0x0000000000000001 0x0 + 1
)
このエラーを解決する方法を教えてください。
ありがとうございました。
プロジェクトに例外ブレークポイントを追加します。
これが壊れる行です。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as ItemTableViewCell <---------------
ただし、コードでは「イメージ」を使用しません。
-[NSObject(NSObject) doesNotRecognizeSelector:]
にシンボリックブレークポイントを設定してみてください。ブレークポイントナビゲーターの左下隅にある[+]
をクリックするだけで、ブレークポイントを追加できます。次に、「シンボリックブレークポイントの追加」をクリックします。クラッシュを再現することで、コードのどこで問題が発生したかをより正確に把握できるはずです。
重要な最初のステップは、エラーメッセージを分析することです。
[UITableViewCellContentView image]: unrecognized selector sent to instance
これは、「メッセージ」image
がUITableViewCellContentViewクラスのオブジェクトに「送信」されたことを示しています。 (つまり、クラスUITableViewCellContentViewのオブジェクトでメソッドimage
を呼び出そうとしました。)
最初に尋ねるのは、「これはまったく意味がありますか?」です。名前付きクラスにImage
メソッドがあり、image
メソッドがないため、呼び出しで間違ったメソッド名が使用された可能性があります。または、名前付きメソッドがsomeMethod:someParm:
である可能性がありますが、クラスはsomeMethod:someParm:anotherParm:
を実装します。これは、呼び出しでパラメーターが省略されたことを意味します。
ただし、ほとんどの場合、名前付きクラスには名前付きメソッドに漠然と似たメソッドさえありません。つまり、失敗した呼び出しで間違ったオブジェクトへのポインターが使用されたことを意味します。
たとえば、次のようにします。
NSArray* myArray = [myDictionary objectForKey:@"values"];
NSString* myString = [myArray objectAtIndex:5];
そして、次の行に沿ってエラーを取得します。
[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance
なぜなら、myDictionary
から取得したオブジェクトは、実際には、予想されたNSArrayではなく、NSDictionaryだったからです。
残念なことに、最も紛らわしいのは、この種のエラーが自分のコードではなくUIシステムコードの奥深くで発生する場合です。これは、何らかの方法で間違ったオブジェクトをシステムインターフェイスに渡した場合、またはInterface Builderまたはその他の場所で間違ったクラスを設定した場合に発生する可能性があります。
別の考えられる理由は、元のオブジェクトが破壊され、その後、別のオブジェクトが同じメモリアドレスに割り当てられたことです。次に、コードはメッセージを送信し、古いオブジェクトへのポインターがまだあると考え、Objective-Cは新しいオブジェクトがそのメッセージを理解しないため、例外をスローします。
この問題を診断するには、「ゾンビ」検出を使用してプロファイラーを実行します。
これらのシナリオでは、次の2つのことを確認すると役立つことがわかりました。
このエラーが発生したのは、通常、タイプBを予期していたときにタイプAのインスタンスにメッセージを送信したためです。
この特定のシナリオでは、親クラスの要件を満たしていない可能性があります(ItemTableViewCellのインスタンスが継承する可能性が最も高いと考えられます)。
ItemTableViewCellクラスのコードを見せていただけますか?
Introspectionを使用して、オブジェクトが特定のセレクターに応答するかどうかを確認できます。
let canWork = yourObject.respondsToSelector(Selector("image")) // true
コードが機能することが真実である場合のみ..そうでない場合は確実にクラッシュします
次のコードを使用して、変数を宣言できます。
let noteListTableViewCellobject = "NoteListTableViewCell";` `// Note listTablecell create custom cell`
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
var cell:NoteListTableViewCell? = tableView.dequeueReusableCellWithIdentifier(noteListTableViewCellobject) as? NoteListTableViewCell
if (cell == nil) {
let nib:Array = NSBundle.mainBundle().loadNibNamed("NoteListTableViewCell", owner: self, options: nil)
cell = nib[0] as? NoteListTableViewCell
}
}
Tableviewセルのオブジェクトを宣言するには、indexPath
を渡す必要があります。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
return cell
}
私は同じ問題を抱えていましたが、これは私のために働いた:
SKSceneでisEqualをオーバーライドします。
- (BOOL)isEqual:(id)other {
if (![other isMemberOfClass:[SKScene class]]) {
return false;
}
return [super isEqual:other];
}