Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
example of a custom tableviewcell
-
Hey Folks,
I'm trying to write a simple score keeper for a pool (billiards) game that my friends and I play. I have the basic mechanics down with the default tableviewcells, but I'd like to make the result a bit prettier by using a custom tableviewcell. I've looked around github and the forums, but I can't find any examples of how to do this. Does anyone have a simple example I can copy from? I'd like to have a cell that has two text labels and an image view all in a single row.
Any help or pointers would be very helpful.
Thanks,
Juan
-
import ui class source (object): def tableview_number_of_rows(self, tv, s): return 4 def tableview_cell_for_row(self, tv, s, r): type = {0:'default', 1:'subtitle', 2:'value1', 3:'value2'}[r] cell = ui.TableViewCell(type) cell.text_label.text = 'Title' try: cell.detail_text_label.text = 'Detail' except AttributeError: pass try: cell.image_view.image = ui.Image.named('ionicons-alert-24') except AttributeError: pass return cell view = ui.TableView() view.data_source = source() view.present()
author: Omega0
-
Thanks for the pointer.
I saw something similar, but this isn't a custom tableviewcell from what I gather. This is just a way to specify the cell type based on pre-defined cell types (subtitles, etc.). I'd like to have a custom tableviewcell class with the three views (two text labels, and one image view). Then during the tableview_cell_for_row method I would instantiate a copy of my own class instead of ui.TableViewCell().
-
You can add subviews to the
content_view
attribute of an instance ofui.TableViewCell
. This is mentioned in the documentation but not directly, it only tells you that views can be added this way, not why you would do it. Also, Dann, for the author of the code above you could find the username of the poster. (I care only because I made it.) -
I couldn't find the username. I had this snippet I'm my 'forum snippets' folder to learn from. I tried searching the forum posts for you. But couldn't :( sorry.
-
That's fine. It was a pretty quick code anyway.
-
@tachijuan Don't know if this helps you...
'Classes' - SettingsSheet
It's switches in a cell... but you could add labels and an image instead by the same method.
-
I think that will do it. Have a long flight tomorrow so I can play with this. Thanks for the help fellas.
-
OK - I was able to make it work by creating a subview and adding the text/image before I added it to the tableviewcell. Still not sure how I would change it after the fact. I tried using the "name" property as the way to refer to the subview. How do I refer to the subviews after I've added them to the tableviewcell?
Sorry for the rookie questions, but I'm still wrapping my head around this one.
-
@tachijuan This is rather brute force, but works. Add a list of cells as a public property, and append the cells as they are created... see updated SettingsSheet class.
-
Cool. That is brute force. Is there no way to give the subview a "name" property so that I can do something like:
cell = ui.TableViewCell() tl = ui.TextLabel() tl.name = "hits" cell.add_subview(tl) cell['hits'] = "2"
Or something like that? The docs seem to say that you can but for some reason it's not working for me.
-
@tachijuan A ui.View can be used like a dict of it's named subviews... but I think this little test script shows that a ui.TableViewCell doesn't support that... try it with View and then TableViewCell. It looks like subviews[n] is as good as it gets.
import ui v = ui.View() #v = ui.TableViewCell() b = ui.Button() b.name = 'btn' v.add_subview(b) print v['btn'].name
-
@techijuan Ok, the trick is to add the subviews to the cell's content_view not the cell... then it works to use content_view like a dict.
P.S. ListDataSource also has an (undocumented ?) tableview attributute that is useful for upwards navigation
-
aha!
Cool. Thank you!