I am doing the project which need to use the storyboard to rewrite the old project. I got some problems when I doing it use the storyboard. I use the normal view controller instead of tableview controller, because there are some buttons and labels in this view controller. The problem is I don't know how to link between this view controller and the detail view controller when users select the cell from the table view.
simply drag the tableview to a normal VC.
ctrl+drag from your table to the orange circle below to connect as delegate/datasource.
make your VC to implement uitableview delegate and datasource protocols (#interface MyVC : UIViewController <UITableViewDataSource, UITableViewDelegate>).
write the mandatory protocol methods:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}
Select a cell in the Table View. And make a segue to the DetailViewController by ctrl clicking on the Table Cell and dragging to the DetailViewController in the Storyboard.
Then select a segue type based on the type of transition you want: modal, or push (if these view controllers are embedded in a navigation controller, etc.)
Probably you should use following code:
[self.navigationController pushViewController:[YourNewViewControllerClass new] animated:YES];
Related
I created the single view application using storyboard.
In storyboard file, i have three view controller
1-navigation controller 2-Recipe Book View Controller 3-View
Controller
Prototype cell of the table view of Recipe Book View Controller is connected through push segue to View Controller.Is the problem Recipe Book View Controller does not navigate to View Controller?
here is the sample of project for download.
https://drive.google.com/open?id=0B5pNDpbvZ8SnLTd1R3NBTE1ReEk
I just Check your project.
Do following steps:-
In Main.storyboard, click on Push segue to ViewController and add name of identifier
Go to ViewController.m and paste below code
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self performSegueWithIdentifier:#"yourSegueName" sender:self];
}
Following mistakes are found in your project.
There is no class for Third VC.
PrepareForSegue not implemented.
You wanted to push VC on TableViewCell selection but there you does not implemented didSelect tableview delegate.
Select the segue connecting RecipeBookViewController to ViewController , Then give that segue an identifier, i.e. "ViewControllerSegue".
Implement the delegate method of table view and call the performSegueWithIdentifier method :
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self performSegueWithIdentifier:#"ViewControllerSegue" sender:tableView];
}
Based on your Source code you have to add some code & classes in your project to achieve your requirement.
1st You have to add RecipeViewController to control your Recipe List and Tableview both.
2nd as You have created this RecipeViewController you need to assign this class to respective ViewController in your storyboard.
3rd Assign Segue from PrototypeCell to ViewController where you need to push.
Hope you can understand whats wrong in your Code.
I have a viewcontroller with multiple tableviewcells in it. I want move from one of the tableviewcell to another viewcontroller using storyboard. I have a navigation controller for viewcontroller. I didn't really find a way to solve this.
You should implement didSelectRowAtIndexPath delegate, then some logic for move to another view controller.
#interface ViewController()<UITableViewDelegate>
...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AnotherViewControllerClass *vc = [[UIStoryboard storyboardWithName:#"StoryboardNameOfAnotherViewController" bundle:nil] instantiateViewControllerWithIdentifier:#"AnotherViewControllerIdentifier"];
[self.navigationController pushViewController:vc animated:YES];
}
if you want to do with storyBoard then you can use Segue to jump from one tableview cell to another ViewController what you have to do is
1). right click and drag from your table view cell to your desired view Controller and then release it you would see a pop up select "show"
2). click the segue and go to identity inspector and name the segue identifier as you wish
3).then you have to just write a method prepareFor segue methodand in that write if statement like this
if (segue.identifier == "your identifier Name")
{
//`enter code here`write your logic of pushing the viewcontroller
}
the above code for if is in swift and you can repeat the steps for your all multiple tableviewcell with diffrent identifier name
if not using storyboard then use this method
if (indexpath.row == 0)
{
//use the push viewcontroller code here
}
for each index path you can check and push diffrent viewcontrollers
Try this..
Open Storyboard and select your initial view controller
Select editor from top bar menu in your Xcode
Select Embed in and choose UINavigationController
And run your code again...
I'm creating a small app with StoryBoard, that currently consist of a Navigation Controller, Table View Controller and a regular view controller. I have an array of objects that is connected to the table view, and now I want to select one of the objects and get the regular view controller on the screen. So, in StoryBoard I CTRL-drag from the prototype to the view controller in order to create a segue (push). Now, I want it to work, but literally nothing happens.
What am I doing wrong? Shouldn't this work directly or am I missing to set some options? I really want this to work with the StoryBoard but I tested to give the segue an identifier and implement the below metod, but that didn't work either.
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
[self performSegueWithIdentifier:#"showInfo" sender:self];
}
for navigating from UITableViewCell, You need to write your "code for navigation" in UITABLEVIEWDELEGATE method,
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// your code for navigation.
}
First, you are using the method tableView:didDeselectRowAtIndexPath:, where it should be tableView:didSelectRowAtIndexPath:. Don't worry, that's something I keep doing from time to time.
Then, make sure your segue's identifier is "showInfo" in your storyboard and you are good to go.
When I work with a TableViewController I am able to setup all my content in storyboards. Since I use Static Cells instead of Dynamic Properties for my table view, I find this method much more convenient and easier to implement. I hook up the new UITableView class and simply delete all the delegate methods. Works like a charm as ALL of the content / buttons are being setup in storyboards.
I am trying to accomplish the same result, except this time, I have to work within a ViewController and add a TableView as a subview. Once I hook up the right class, add my outlet connection and setup the following delegates:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = #"MainCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
return cell;
}
This works well if my TableView is set to Dynamic Properties :
But when I change the Table View content to Static Cells and delete the delegate method, my app crashes. So, How can I add a table view with Static Cells (That I can manipulate in storyboards) to my ViewController?
Here is what you can do. In your storyboard, create a parent view controller that contains all your non tableview views also, create a UITableViewController. In your parent view controller, create container view, delete the view controller it auto adds, and right click and drag from the container view to your UITableViewController to create an embed segue. Your end result should look something like this:
As far as I know, you can't do this directly. At least in iOS 6, you had to use a UITableViewController when using static cells. One way to use a static table view inside a UIViewController would be to add a container view in IB, and make the embedded controller a table view controller (delete the UIViewController you get automatically, drag in a UITableViewController, and hook it up with the embed segue). You can get a reference to this table view controller from the UIViewController by implementing prepareForSegue:sender:, and using the destinationViewController property (which will point to the table view controller).
You still need to do a couple of things:
Add <UITableViewDataSource, UITableViewDelegate> to your #interface declaration.
Then you can set these also in Interface Builder.
Implement cellForRowAtIndexPath and call the dequeueReusableCellWithIdentifier method to return the cell.
Sorry, I was wrong. The truth is you cannot use static cells without a UITableViewController. Sorry.
A solution could be that you create two controllers and just add the view of the table view controller to your other view controller.
Basically what I want to do is to include UIView to multiple UIViewControllers on storyboard. I could include the uiview, but segues in the UIView doesn't work.
I have a storyboard something like this:
I have a tab controller with 2 UIViewControllers First and Second. And I have a separated UITableViewController with two another UIViewControllers A and B, connected with segues.
I could add the table view into First and Second views as a subview, but when I tap cell it doesn't go to next screen A or B. I sort of figured out why it didn't work, but just can't figure the best way to accomplish this.
Is there any good way to do this? I'm new to storyboard but have been developing iOS app for a while.
EDIT:
The way I add the tableViewController to each View is following:
self.tableViewController = [self.storyboard instantiateViewControllerWithIdentifier:#"theTableViewController"];
[self.view addSubview:_tableViewController.tableView];
When a cell in the table view is tapped, prepareForSegue:segue:sender is invoked, but no push to navigation controller since the table view controller is sitting in each view controller as just a subview
EDIT2:
I posted my test project here
There are 2 methods you can try .
1.Create a segue between the tableview cell and next view controller directly. What I want to emphasize is the fact that do not create segue between the tableview or view and the next view controller,unless trying the method below.
2.Add this code to your tableview controller :
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([indexPath row]) {
[self performSegueWithIdentifier:#"segueToB" sender:self];
}else {
[self performSegueWithIdentifier:#"segueToA" sender:self];
}
}
I finally figured out how to make segue within sub views. It was actually very simple. It seems that I need to add the view controllers to the main view controller as a "childViewControllers"
instead of
self.tableViewController = [self.storyboard instantiateViewControllerWithIdentifier:#"theTableViewController"];
I did like this:
[self addChildViewController:[self.storyboard instantiateViewControllerWithIdentifier:#"theTableViewController"];
[self.view addSubview:_tableViewController.tableView];
and segues in the childViewController work as I expect. Thank you guys for your help.