lakshmen
lakshmen

Reputation: 29064

Passing data to the detail view in UITableView

I would like to print out the indexPath.row number on the label.text in the detailview by passing the data between the UITableView and the detailview but I am not able to do it correctly.

ViewController.h

#import <UIKit/UIKit.h>
#import "SecondViewController.h"


@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{
    NSArray *tableItems;
    NSArray *images;

}

@property (nonatomic,retain) NSArray *tableItems;
@property (nonatomic,retain) NSArray *images;

@end

ViewController.m

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize tableItems,images;
- (void)viewDidLoad
{
    [super viewDidLoad];
    tableItems = [[NSArray alloc] initWithObjects:@"Item1",@"Item2",@"Item3",nil];
    images = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"clock.png"],[UIImage imageNamed:@"eye.png"],[UIImage imageNamed:@"target.png"],nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return tableItems.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    //Step 1:Check whether if we can reuse a cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    //If there are no new cells to reuse,create a new one
    if(cell ==  nil)
    { 
        cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:@"cell"];
        UIView *v = [[UIView alloc] init];
        v.backgroundColor = [UIColor redColor];
        cell.selectedBackgroundView = v;
        //changing the radius of the corners
        //cell.layer.cornerRadius = 10;

    }

    //Set the image in the row
    cell.imageView.image = [images objectAtIndex:indexPath.row];

    //Step 3: Set the cell text content
    cell.textLabel.text = [tableItems objectAtIndex:indexPath.row];

    //Step 4: Return the row
    return cell;

}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    cell.backgroundColor = [ UIColor greenColor];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

    [secondViewController printRowNumber:indexPath.row+1];

    NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];

    secondViewController.selectedRow = selectedRow;

    //[self.navigationController pushViewController:secondViewController animated:YES];
    [self presentViewController:secondViewController animated:YES completion:NULL];
}
@end

SecondViewController.h

#import <UIKit/UIKit.h>
#import "ViewController.h"


@interface SecondViewController : UIViewController{
    IBOutlet UILabel *lbl;
    NSString *selectedRow;

}
@property (nonatomic,retain) UILabel *lbl;
@property (nonatomic,retain) NSString *selectedRow;

- (IBAction)goBack:(id)sender;

-(void) printRowNumber:(int)num;
@end

SecondViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

@synthesize lbl,selectedRow;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //[self changeLabel:@"Hello"];
    //lbl.text = @"Hello";
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)goBack:(id)sender{

    //ViewController *firstViewController = [[ViewController alloc] initWithNibName:nil bundle:nil];
    //firstViewController.delegate = self;
    [self dismissViewControllerAnimated:YES completion:NULL];
}

-(void) printRowNumber:(int)num{
    lbl.text = selectedRow;
    NSLog(@"%@",lbl.text);
    NSLog(@"%d",num);
}
-(void) changeLabel:(NSString*)str{
    lbl.text = str;
    //lbl.text = @"Hello";
}
@end

Not sure how to solve this problem.. Need some help on this..

Upvotes: 1

Views: 3909

Answers (5)

Mohammad Kamar Shad
Mohammad Kamar Shad

Reputation: 6067

Se below, you need to change a little piece of code.

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

  SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

  NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];

  secondViewController.selectedRow = selectedRow;

  //[self.navigationController pushViewController:secondViewController animated:YES];
  [self presentViewController:secondViewController animated:YES completion:NULL];

  //this is the change you should do.
  [secondViewController printRowNumber:indexPath.row+1];

}

Upvotes: 1

Oscar
Oscar

Reputation: 651

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

    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

    NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];

    secondViewController.selectedRow = selectedRow;

    [self presentViewController:secondViewController animated:YES completion:^{
        [secondViewController printRowNumber:indexPath.row+1];
    }];
}

View in SecondViewController will be created after you present the controller. So if you call -printRowNumber: before you present the controller, your label is still not created.

Upvotes: 1

Venk
Venk

Reputation: 5955

Call the -(void) printRowNumber:(int)num method in viewDidLoad in SecondViewController and remove [secondViewController printRowNumber:indexPath.row+1]; from rowDidSelect in firstViewController.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self printRowNumber:[selectedRow intValue]];
}

try this it may helps you....

Upvotes: 1

Manish Agrawal
Manish Agrawal

Reputation: 11026

[secondViewController printRowNumber:indexPath.row+1];
NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];
secondViewController.selectedRow = selectedRow;

If you look these three lines of code in you didSelect method, you are calling the method printRowNumber without setting your selectedRow string, so it will not work, try switching the order as:

NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];
secondViewController.selectedRow = selectedRow;

[secondViewController printRowNumber:indexPath.row+1];

Upvotes: 1

Rajan Balana
Rajan Balana

Reputation: 3815

I would like to suggest you to just pass the value from current view controller to the next view controller, don't call the function of next controller from current controller. It will lead to deallocation of object.

just pass the value and push that view controller instantly and enjoy the value. Hope it works for you.

Upvotes: 1

Related Questions