Reputation: 29064
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
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
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
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
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
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