I have been trying to get an application using PyObjC to display  
colors in an NSTableView. In my searching around, it seems the  
consensus is "NSColorWell isn't an NSCell, create your own subclass  
of NSCell which just shows the color."

So, with no further information, I tried this with an NSCell subclass:

class MyColorCell(NSCell):
     currentColor = objc.ivar('currentColor')

     def setObjectValue_(self, objectValue):
         self.currentColor = objectValue

     def drawInteriorWithFrame_inView_(self, cellFrame, controlView):
         if self.currentColor is not None:
             self.currentColor.drawSwatchInRect_(cellFrame)

and in my app delegate I have:

class ColorCellExampleAppDelegate(NibClassBuilder.AutoBaseClass):
     colors = objc.ivar('colors') # array containing created model  
objects
     colorArrayController = objc.ivar('colorArrayController') # bound  
so we can use addObject_()
     newColorWell = objc.ivar('newColorWell')
     colorTableColumn = objc.ivar('colorTableColumn') # use to set  
the data cell.

     def applicationDidFinishLaunching_(self, notification):
         self.colorCell = MyColorCell.alloc().init()
         self.colorTableColumn.setDataCell_(self.colorCell)

     def addNewColor_(self, sender): # bound to add button
         newColor = MyModelColorValue.alloc().initWithColor_ 
(self.newColorWell.color())
         self.colorArrayController.addObject_(newColor)

The model object definition is:
class MyModelColorValue(NSObject):
     color = objc.ivar('color')

     def initWithColor_(self,  color):
         self.color = color.copy()
         return self

The problem comes once I try to click on the colors in the list, the  
program just barfs. It looks like an object is getting freed where it  
shouldn't.
I'm getting either
objc: FREED(id): message isKindOfClass: sent to freed object=0x11cd510
or just a plain "Bus error" before it dies.

Looking at the stack trace, the first few lines are:
0   <<00000000>>        0xfffeff18 objc_msgSend_rtp + 24
1   com.apple.AppKit                    0x93905594 -[NSValueBinder  
displayValueForObjectValue:] + 204
2   com.apple.AppKit                    0x93904b7c -[NSValueBinder  
_adjustObject:mode:observedController:observedKeyPath:context:editableSt 
ate:adjustState:] + 968
3   com.apple.AppKit                    0x9392fd04 -[NSValueBinder  
updateTableColumnDataCell:forDisplayAtIndex:] + 140
4   com.apple.AppKit                    0x939304d0 -[NSTextValueBinder  
updateTableColumnDataCell:forDisplayAtIndex:] + 88
5   com.apple.AppKit                    0x9392fc5c -[_NSBindingAdaptor  
tableColumn:willDisplayCell:row:] + 108
6   com.apple.AppKit                    0x9378d7c4 -[NSTableView  
_sendDelegateWillDisplayCell:forColumn:row:] + 88
7   com.apple.AppKit                    0x9378d204 -[NSTableView  
_drawContentsAtRow:column:clipRect:] + 396
8   com.apple.AppKit                    0x9378cbf8 -[NSTableView  
drawRow:clipRect:] + 220

I have a sample project demonstrating the error, but I can't attach  
it for some reason, so if you want it, email me.. I would appreciate  
it if someone can tell what is going on, or can point me towards  
getting started in debugging memory errors in PyObjC.

Thanks,
Josh

_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig

Reply via email to