I'm having the same problems when I try.
Also, clicking an item seems to work but walking the list not.
Here's my attempt, a list of two million random numbers.
Clicking the second column will sort the data.
Code: Select all
; create array with two million 32 bit values
Global Dim MyArray.l(1999999)
; fill array with random numbers
RandomData(@MyArray(), 2000000 << 2)
; dataSource number of rows
ProcedureC.i numberOfRows(obj, sel, tableView)
ProcedureReturn ArraySize(MyArray()) + 1
EndProcedure
; dataSource get value
ProcedureC.i getTableValue(obj, sel, tableView, tableColumn, rowIndex)
Protected.i NSNumber, Columns
Protected.i Column0, Column1
Columns = CocoaMessage(0, tableView, "tableColumns")
Column0 = CocoaMessage(0, Columns, "objectAtIndex:", 0)
Column1 = CocoaMessage(0, Columns, "objectAtIndex:", 1)
Select tableColumn
Case Column0
NSNumber = CocoaMessage(0, 0, "NSNumber numberWithInteger:", rowIndex)
Case Column1
NSNumber = CocoaMessage(0, 0, "NSNumber numberWithLong:", MyArray(rowIndex))
EndSelect
ProcedureReturn CocoaMessage(0, NSNumber, "stringValue")
EndProcedure
; dataSource set value (not implemented because we want read-only)
ProcedureC setTableValue(obj, sel, tableView, object, tableColumn, rowIndex)
EndProcedure
; delegate selection change
ProcedureC selectionChange(obj, sel, notification)
PostEvent(#PB_Event_Gadget, 0, 0, #PB_EventType_Change)
EndProcedure
; delegate column click
ProcedureC columnClick(obj, sel, tableView, tableColumn)
Protected.i Columns
Protected.i Column0, Column1
Columns = CocoaMessage(0, tableView, "tableColumns")
Column0 = CocoaMessage(0, Columns, "objectAtIndex:", 0)
Column1 = CocoaMessage(0, Columns, "objectAtIndex:", 1)
Select tableColumn
Case Column1
SortArray(MyArray(), #PB_Sort_Ascending)
CocoaMessage(0, tableView, "reloadData")
EndSelect
EndProcedure
; create classes
class = objc_allocateClassPair_(objc_getClass_("NSObject"), "MyTableDataSourceClass", 0)
class_addMethod_(class, sel_registerName_("numberOfRowsInTableView:"), @numberOfRows(), "v@:@")
class_addMethod_(class, sel_registerName_("tableView:objectValueForTableColumn:row:"), @getTableValue(), "@@:@@i")
class_addMethod_(class, sel_registerName_("tableView:setObjectValue:forTableColumn:row:"), @setTableValue(), "v@:@@@i")
objc_registerClassPair_(class)
class = objc_allocateClassPair_(objc_getClass_("NSObject"), "MyTableDelegateClass", 0)
class_addMethod_(class, sel_registerName_("tableViewSelectionDidChange:"), @selectionChange(), "v@:@")
class_addMethod_(class, sel_registerName_("tableView:didClickTableColumn:"), @columnClick(), "v@:@@")
objc_registerClassPair_(class)
; ListIconGadget callback
Procedure ListIconGadgetCB()
If GetGadgetState(0) >= 0
SetGadgetText(1, Str(MyArray(GetGadgetState(0))))
EndIf
EndProcedure
; test
OpenWindow(0, 0, 0, 400, 340, "ListIconGadget demo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 10, 10, 380, 280, "Column 1", 150)
AddGadgetColumn(0, 1, "Column 2", 150)
StringGadget(1, 10, 300, 380, 30, "", #PB_String_ReadOnly)
DataSource = CocoaMessage(0, 0, "MyTableDataSourceClass new")
Delegate = CocoaMessage(0, 0, "MyTableDelegateClass new")
CocoaMessage(0, GadgetID(0), "setDataSource:", DataSource)
CocoaMessage(0, GadgetID(0), "setDelegate:", Delegate)
BindGadgetEvent(0, @ListIconGadgetCB(), #PB_EventType_Change)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow