In viewDidLoad, your tableView is empty, then scrolling to row 16 is not possible. The call is evaluated immediately because there is no need for animation
When you use animated: YES, the animation is delayed until a view appears, your table will be populated then.
Instead, you can use this kind of code in viewDidAppear (or viewWillAppear) when your table is already populated with data. This will trigger it every time a view is presented though (unless you add some logic), not sure if this meets your requirement ...
source share