2013-03-20 53 views
1

我想用PyObjC製作NSTableView。 所以我寫下如下代碼。 這段代碼起作用,至少我可以看到TableView。 但是當我激活tableView:objectValueForTableColumn:row:(該方法在下面註釋掉)時,python會通過segmantation故障崩潰。PyObjC通過使用NSTableView崩潰

我想知道我犯的錯誤。謝謝。

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

我得到了probrem解決。 我需要實現的DataSource協議象下面這樣:

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

,然後在TableViewController類,設置數據源象下面這樣:

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

現在一切工作正常。