Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change a UIViewController to a UITableViewController inside a storyboard?

I've made a view in my storyboard which I've now decided I'd rather display its data via static table cells.

I can't use static table views in a UIViewController (Static table views are only valid when embedded in UITableViewController instances). So, I need to convert my existing UIViewController to a UITableViewController somehow. I've changed the .h file's parent, but that hasn't done it.

Is there another way to get this going? I'd really rather not have to make a new VC in the storyboard and move everything over, it's a big hassle.

like image 304
Luke Avatar asked Dec 19 '12 16:12

Luke


People also ask

How to change view controller to table view controller?

If you have a viewController that started out as a plain view controller but you want to turn it into a table view controller you can simply edit the file reversing the node. Works perfectly!

What is UITableViewController?

A view controller that specializes in managing a table view.

How do I connect storyboard to ViewController?

Create a new IBOutlet called shakeButton for your storyboard button in your ViewController. swift file. Select the shake button in Interface Builder. Then hold down the control button ( ⌃ ) and click-drag from the storyboard button into your ViewController.


1 Answers

I'll add to this, since the question is about how to change a UIViewController into a UITableViewController, and given that this question is over a year old and the original answer, while valid and may or may not have been the only solution at the time, doesn't actually answer the question and is not the only solution.

It IS possible to do this, you just have to set up the table view delegate and datasource outlets in IB, and manually edit the storyboard XML, which sounds scary but is actually very easy.

First, change your class's parent to be a UITableViewController. UITableViewController already adopts the UITableViewDatasource and UITableViewDelegate protocols, so if your class does too you can remove them:

@implementation MyTableViewController : UITableViewController
...
@end

Next, create new referencing outlets on your UITableView for its dataSource and delegate. The easiest way to do this is to control-drag from the UITableView to itself. The popup will give you the dataSource and delegate options.

Lastly, you need to change the storyboard XML. The storyboard file can get pretty big pretty fast. The easiest way to find the scene you are looking for is by setting Storyboard Identifier in the Identity Inspector. To view the XML directly, right click on the storyboard file in the project navigator and select "Open As -> Source Code". Now just search for whatever you set the reuse identifier to earlier. You'll see something similar to this:

<!-- My Table View Controller -->
<scene sceneID="EuE-XX-cCb">
  <objects>
    <viewController storyboardIdentifier="MY_TABLE_VIEW_IDENTIFIER" ... >
      // Lots of other stuff
    </viewController>
  </objects>
</scene>

All you need to do is change the opening and closing view controller tags

<viewController>
</viewController>

to be tableViewController instead

<tableViewController>
</tableViewController>

That's it! No need to create a new UITableViewController scene or embed a UITableViewController in a container view.

EDIT:

I should also add that the UITableView MUST be the root view. It cannot be embedded inside another UIView.

like image 114
Jordan Avatar answered Oct 21 '22 11:10

Jordan