PyObjC使用NSTableView崩溃

时间:2013-03-20 09:09:03

标签: python pyobjc

我想用PyObjC制作NSTableView。 所以我编写了如下代码。 这段代码起作用,至少,我可以看到TableView。 但是当我激活tableView:objectValueForTableColumn:row:时(方法在下面被注释掉),python会因为segmantation故障而崩溃。

我想知道我犯了什么错误。感谢。

class WindowController(object):

    def numberOfRowsInTableView_(self, table):
        return 2000

    #def tableView_objectValueForTableColumn_row_(self, table, column, row):
    #    return 'hi'

    def initMainWindow(self):
        windowRect = NSMakeRect(0.0, 0.0, 300.0, 500.0)
        self.window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(
                windowRect,
                NSTitledWindowMask
                    | NSClosableWindowMask
                    | NSResizableWindowMask
                    | NSMiniaturizableWindowMask
                    | NSTexturedBackgroundWindowMask,
                NSBackingStoreBuffered,
                False)
        self.window.setDelegate_(self.delegate)
        self.view = self.initView()
        self.window.contentView().addSubview_(self.view)
        self.window.display()
        self.window.orderFrontRegardless()

    def initView(self):
        tableContainer = NSScrollView.alloc().initWithFrame_(NSMakeRect(0,0,300, 500))
        tableView = NSTableView.alloc().initWithFrame_(NSMakeRect(0,0,300,500))
        column1 = NSTableColumn.alloc().initWithIdentifier_("Col1")
        tableView.addTableColumn_(column1)
        tableView.setDelegate_(self)
        tableView.setDataSource_(self)
        tableView.reloadData()

        tableContainer.setDocumentView_(tableView)
        tableContainer.setHasVerticalScroller_(True)
        return tableContainer

1 个答案:

答案 0 :(得分:1)

我把问题解决了。 我需要实现如下的DataSource Protocol:

class MyDataSource(NSObject, objc.protocolNamed('NSTableViewDataDource')):
    def numberOfRowsInTableView_(self, table):
        return 1000
    def tableView_objectValueForTableColumn_row_(self, table, column, row):
        return 'xyzzy'

然后,在TableViewController类中,设置如下的DataSource:

ds = MyDataSource.alloc().init()
myTableView.setDataSource_(ds)

现在一切正常。