This is definitely an iOS bug. Solution above didn't work out-of-the-box for me, but this did if you put this in the tab bar controller's viewDidAppear
method:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSInteger currentTab = (NSInteger)self.tabBarController.selectedIndex;
self.tabBarController.selectedIndex = abs(currentTab - 1);
self.tabBarController.selectedIndex = currentTab;
});
If you put this in the view controllers viewDidAppear
for a view controller in a tab you will create an infinite loop. In that cause use the once token approach mentioned in the question.