Forum Archive

Delete rows in tableview

coomlata1

I have a tableview created in a pyui file rather than in code. The data source is a csv file. I can delete a row in the tableview, but how can I then capture the event and be able to delete the respective item in the csv file.

Any help is appreciated. This forum is an extraordinary source of information.

Phuket2

@coomlata1 , this calls you back when a row is deleted. It's not exactly documented as far as I can see, but my feeling is it supposed to be used like this or at least can been with ui.ListDataSource which is what is automatically assigned when you create a table in the ui.designer. If you look at the data_source callbacks, you could also trap the other callbacks if you wanted or needed doing the same.

```

coding: utf-8

import ui

def tableview_delete(tableview, section, row):
# Called when the user confirms deletion of the given row.
print 'in delete', tableview, section, row

load

v = ui.load_view('Table.pyui')
tbl = v['tbl'] # get a ref to the table in the form

replace the tableview_delete function

tbl.data_source.tableview_delete = tableview_delete
v.present('sheet')```

vcr80

What would tableview_delete() look like if I want to show the default visual behaviour and perform some additional action?

JonB

Take a look at ui.py in Standard Library/site-packages/ui.py, and look at the ListDataSource, which has a fairly complete implementation.

Be sure to implement tableview_can_delete(self, tv, section, row): to give you the delete button when swiping left. then tableview_delete should call
tv.delete_rows([row])
to animate the deletion.

@omz ... does delete_rows take a section argument? Does this work with tableviews that have multiple sections?

omz

@JonB Yes, you can pass a sequence of numbers or 2-tuples. If you pass tuples, they're interpreted as (row, section).

dgelessus

@omz Is there a reason why delete_rows takes the tuples in (row, section) order instead of (section, row) like everything else?

omz

@dgelessus Yes, stupidity. ;) To be honest, I was surprised by that too, I think I did it this way because the corresponding ObjC objects are constructed with the method indexPathForRow:section:.

vcr80

Unfortunately, this gives me an Error. "Inconsistent number of rows after deletion.", @JonB

omz

You need to ensure that your tableview_number_of_rows method returns the correct number, i.e. you must delete the row from your data before calling delete_rows.

vcr80

Ah, thanks @omz - got it now!