質問

クリックしたときにnscolorpanelを表示するために、次のコードを備えたカスタムNScellがあります。

-(void)setColorFromPanel:(NSColorPanel*)panel{
 NSLog(@"COLOR is HERE!");
 [self setObjectValue:[panel color]];
}

- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView{
 if(self.isColor){
  if([event type]==NSLeftMouseDown){
   NSColorPanel *panel=[NSColorPanel sharedColorPanel];
   [panel setColor:[self objectValue]];
   [panel setShowsAlpha:YES];
   [panel setAction:@selector(setColorFromPanel:)];
   [panel setTarget:self];
   [panel makeKeyAndOrderFront:nil];
  }
  return NSCellHitContentArea;
 }
    return NSCellHitNone;
}

このコードにはカラーピッカーが表示されますが、色をクリックするとクラッシュします。 [パネルSettarget:self]ラインを削除する場合、効果はありませんが、それは正常に動作します(ターゲットがないため、色の値を受け取らないため)。

これがスタックトレースです。エラーはexc_bad_accessです。

#0  0x00007fff8667811c in objc_msgSend ()
#1  0x00007fff87081e9a in -[NSApplication sendAction:to:from:] ()
#2  0x00007fff871fa1cd in -[NSColorPanel _forceSendAction:notification:firstResponder:] ()
#3  0x00007fff871fe384 in -[NSColorPanel setColor:] ()
#4  0x00007fff8721d112 in -[NSColorPickerWheel setColor:] ()
#5  0x00007fff8721d5ae in -[NSColorPickerWheel brightnessSlider:] ()
#6  0x00007fff87081e9a in -[NSApplication sendAction:to:from:] ()
#7  0x00007fff87081df9 in -[NSControl sendAction:to:] ()
#8  0x00007fff8710d400 in -[NSCell trackMouse:inRect:ofView:untilMouseUp:] ()
#9  0x00007fff873eaf01 in -[NSSliderCell trackMouse:inRect:ofView:untilMouseUp:] ()
#10 0x00007fff8710c215 in -[NSControl mouseDown:] ()
#11 0x00007fff8702634f in -[NSWindow sendEvent:] ()
#12 0x00007fff86f5ba86 in -[NSApplication sendEvent:] ()
#13 0x00007fff86ef24da in -[NSApplication run] ()
#14 0x00007fff86eeb1a8 in NSApplicationMain ()
#15 0x00000001000029bb in main (argc=1, argv=0x7fff5fbff6a0)
役に立ちましたか?

解決

クラッシュレポート/デバッガー出力の関連する部分を投稿する必要があります。そうでなければ、何がうまくいかなかったかを正確に推測するのは難しいです!私たちはサイキックではありません、あなたは知っています。クラッシュレポートには、なぜクラッシュしたのか貴重な情報が含まれています。

そうは言っても、オープンソースのカラーウェルセルがあります ここ. 。 GC対応アプリ専用ですが、そのコードのライセンスが使用法に適合する場合は、上に向上するのに適したスタートである必要があります。ホイールを再発明しないでください。


いくつかの言葉を追加させてください。 NSCellNSTableView aとして使用されます スタンプ 各行のエントリを描画し、通常は再利用されますが、それはそうではありません NSCell 各行について生成されます。これは、システムに豊富なメモリを持つ現在の視点からはあまり意味がありませんが、15年前にNextStepが最初に設計されたときに理にかなっています。

とにかく、この理由のために、セルが別のオブジェクトのターゲットとして自分自身を設定することは通常、そのセルが持続しない傾向があるため、それ自体を設定することは良い考えではありません。それがこのクラッシュの原因だと思います。 NSTableColumn その特定のセルの使用が終了したため、すでにセルを放出していました。一般に、セル自体ではなく、パネルのターゲットとしてコントローラークラスを持つことはより安全です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top