In an app I'm working on, I have a plain style UITableView that can contain a section containing zero rows. I want to be able to scroll to this section using scrollToRowAtIndexPath:atScrollPosition:animated: but I get an error when I try to scroll to this section due to the lack of child rows.
Apple's calendar application is able to do this, if you look at your calendar in list view, and there are no events in your calendar for today, an empty section is inserted for today and you can scroll to it using the Today button in the toolbar at the bottom of the screen. As far as I can tell Apple may be using a customized UITableView, or they're using a private API...
The only workaround I can think of is to insert an empty UITableCell in that's 0 pixels high and scroll to that. But it's my understanding that having cells of varying heights is really bad for scrolling performance. Still I'll try it anyway, maybe the performance hit won't be too bad.
Update
Since there seems to be no solution to this, I've filed a bug report with apple. If this affects you too, file a duplicate of rdar://problem/6263339 (Open Radar link) if you want this to get this fixed faster.
Update #2
I have a decent workaround to this issue, take a look at my answer below.
This is an old question, but Apple still haven't added anything which helps or fixed the crash bug where the section has no rows.
For me, I really needed to make a new section scroll to the middle when added, so I now use this code:
Hope you like it - it's based on Mike Akers' code as you can see, but does the calculation for scrolling to the middle instead of top. Thanks Mike - you're a star.
UPDATE: Looks like this bug is fixed in iOS 3.0. You can use the following
NSIndexPath
to scroll to a section containing 0 rows:I'll leave my original workaround here for anyone still maintaining a project using the 2.x SDK.
Found a decent workaround:
The code above will scroll the tableview so the desired section is visible but not necessarily at the top or bottom of the visible area. If you want to scroll so the section is at the top do this:
Modify sectionRect as desired to scroll the desired section to the bottom or middle of the visible area.
A Swift approach to the same:
I think a blank row is probably the only way to go there. Is it possible to redesign the UI such that the "empty" row can display something useful?
I say try it out, and see what the performance is like. They give pretty dire warnings about using transparent sub-views in your list items, and I didn't find that it mattered all that much in my application.