Eric
Eric

Reputation: 3363

ToolBar between UINavigationBar and UITableView?

I have a UITableViewController embedded on a UINavigationController. This tableView is an instance of NSFetchedResultsController. I need to add a Toolbar between the NavigationController's top bar and the TableViewController, but I can't figure out how to do it (I don't even know if it's possible). I want to do something like Apple did with their WWDC App (except that they don't have the TableViewController embedded in the NavigationController). I need to have some controls on the bar to drive the NSFetchedResultsController.

Some people suggested to people with similar problems to use a UITableView instead of a TVC, but I do need to have a TVC as an instance of NSFetchedResultsController.

Any ideas on how to accomplish this? Would I have to do it programmatically? If so, how?

Btw, I'm targeting iOS6+ with storyboards and ARC.

Apple's WWDC App

Upvotes: 0

Views: 1261

Answers (6)

Steve Moser
Steve Moser

Reputation: 7797

You can use the UITableViewController (keep the niceties such as UIRefreshControl support and keyboard avoidance). You just have to embed your toolbar in a plain view and place that in your tableHeaderView. Then implement this scroll view delegate method to lock.

#pragma mark - UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect rect = self.toolbarContainerView.frame;
    rect.origin.y = MIN(0,scrollView.contentOffset.y + scrollView.contentInset.top);
    self.toolbarContainerView.frame = rect;
}

Note that if you also use section header you will have to send those views behind your tableHeaderView otherwise they will float over the tableHeaderView.

Upvotes: 0

Aaron Brager
Aaron Brager

Reputation: 66234

Technical Note TN2154: UIScrollView And Autolayout provides another solution:

Note that you can make a subview of the scroll view appear to float (not scroll) over the other scrolling content by creating constraints between the view and a view outside the scroll view’s subtree, such as the scroll view’s superview.

That is, even if a scroll view (such as a table view) modifies the subview's frame, the auto layout engine will reset it on the next layout pass.

Upvotes: 2

iphonic
iphonic

Reputation: 12719

Use UIViewController instead of just UITableViewController where you can easily place other controls apart from just a UITableView.

Hope this helps.

Upvotes: 0

Timothy Moose
Timothy Moose

Reputation: 9915

The approach I prefer is to use a UIViewController at the outer level, containing your toolbar and a container view that holds the table. Then build your table in a separate UITableViewController and wire it into the container view using an embed segue. Overall, I think this makes the code more modular and easier to follow because the high-level structure is laid out in the storyboard.

The steps to use an embed segue are as follows:

  1. Control-drag from the container view to the view controller you want to embed and select the "Embed" option.
  2. Give the embed segue an identifier in the attributes inspector.
  3. Configure the table view controller in the parent's prepareForSegue method, checking for your segue's identifier.

There is an example of this in my VCollectionViewGridLayout library. Take a look at the Sort & Filter example project.

Upvotes: 6

crz
crz

Reputation: 458

you need use UIViewController, then add tool bar and tableView instance of NSFetchedResultsController class inside it in storyboard

Upvotes: 1

Divyam shukla
Divyam shukla

Reputation: 2048

You can make a topBar of any UIView and then pass it as the tableHeaderView. It may help you.

Upvotes: 0

Related Questions