Passing Data between View Controllers : from uitableview to a details view controller

冷暖自知 提交于 2019-11-28 13:12:40

For demo purpose, I will assume we have two view controllers ListViewController and DetailViewController. ListViewController has tableview and you have created a segue between your tableview cell and details view controller.

I'm assuming you are naming it as 'DetailSegue'. Your storyboard should look similar to the below image.

Select the segue between tableViewCell and DetailViewController, open the attributes inspector and specify the identifier as 'DetailSegue'. See the image below,

Run the application now, you should see a smooth navigation from ListViewController to DetailViewController.

Assuming you datasource is an array of stings and you have your datasource and delegate setup already properly for your list tableView.

Add a method prepareForSegue:sender in your List view controller, this method will get called whenever segue is about to execute.This method will be automatically invoked.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if ([segue.identifier isEqualToString:@"DetailSegue"]) {
    DetailViewController *detailVC = (DetailViewController*)segue.destinationViewController;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)sender];
    detailVC.title = [self.source objectAtIndex:indexPath.row];
  }
}

Add a property called title in DetailViewController to store the selected title and add another outlet for UILabel to display the title in the view.

DetailViewController.h

#import <Foundation/Foundation.h>

@interface RecipeListViewController : NSObject

@property (weak, nonatomic) NSString *title;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;

@end

DetailViewController.m

@implementation RecipeListViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.titleLabel.text = self.title;
}
@end

Don't forget to connect the outlet. I hope this gives you an rough idea of how we can pass data between view controllers.

Yes you need to use the

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

method (override) witch allows you to pass details by getting the segue.destinationViewController, then set the attributes of the destination controller.

e.g

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
detailViewController *dv = (detailViewController*)segue.destinationViewController;
dv.attribute1 = dataFromTable;
}

If, for example you have your tables data in the array an easy way to do this is to get the row number of the row pushed and set it to a variable

int rowPressed;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

rowPressed = indexPath.row;

}

Then in the PrepareForSegue pass the data to the DetailViewController. Using the rowPressed to get the relevant data from your data model.

Hope this helps!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!