Xcode how to link UITableView Cells to a new View Controller
10,760
In didSelectRowAtIndexPath
you can just init another view controller and present. You can present it from self.navigationController
so that there is a back button if you wish. Here I show it presented modally:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Deselect row
[tableView deselectRowAtIndexPath:indexPath animated:YES];
// Declare the view controller
UIViewController *anotherVC = nil;
// Determine the row/section on the tapped cell
switch (indexPath.section) {
case 0:
switch (indexPath.row) {
case 0: {
// initialize and allocate a specific view controller for section 0 row 0
anotherVC = [[ViewControllerForRowZeroSectionZero alloc] init];
break;
}
case 1: {
// initialize and allocate a specific view controller for section 0 row 1
anotherVC = [[ViewControllerForRowOneSectionZero alloc] init];
break;
}
}
break;
case 1: {
// initialize and allocate a specific view controller for section 1 ALL rows
anotherVC = [[ViewControllerForAllRowsSectionOne alloc] init];
break;
}
}
// Get cell textLabel string to use in new view controller title
NSString *cellTitleText = [[[tableView cellForRowAtIndexPath:indexPath] textLabel] text];
// Get object at the tapped cell index from table data source array to display in title
id tappedObj = [sitesArray objectAtIndex:indexPath.row];
// Set title indicating what row/section was tapped
[anotherVC setTitle:[NSString stringWithFormat:@"You tapped section: %d - row: %d - Cell Text: %@ - Sites: %@", indexPath.section, indexPath.row, cellTitleText, tappedObj]];
// present it modally (not necessary, but sometimes looks better then pushing it onto the stack - depending on your App)
[anotherVC setModalPresentationStyle:UIModalPresentationFormSheet];
// Have the transition do a horizontal flip - my personal fav
[anotherVC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
// The method `presentModalViewController:animated:` is depreciated in iOS 6 so use `presentViewController:animated:completion:` instead.
[self.navigationController presentViewController:anotherVC animated:YES completion:NULL];
// We are done with the view controller. It is retained by self.navigationController so we can release it (if not using ARC)
[anotherVC release], anotherVC = nil;
}
Comments
-
Blake Loizides almost 2 years
I currently have developed a Tabbed Based Application. The first Tab is decors which displays Colour Swatches or Images in a TableView Structure. Currently when you push on a image or Colour swatch An alert pops up saying which table cell you have pushed. I instead want to link each table cell image or Colour swatch to a new view controller showing a bigger image of that image or colour swatch. A modal would also do fine
#import "TableViewsViewController.h" @implementation TableViewsViewController #pragma mark - #pragma mark Synthesizers @synthesize table; @synthesize sitesArray; @synthesize imagesArray; #pragma mark - #pragma mark View lifecycle // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { // Load up the sitesArray with a dummy array : sites NSArray *sites = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", nil]; self.sitesArray = sites; [sites release]; UIImage *active = [UIImage imageNamed:@"a.png"]; UIImage *ae = [UIImage imageNamed:@"b.png"]; UIImage *audio = [UIImage imageNamed:@"c.png"]; UIImage *mobile = [UIImage imageNamed:@"d.png"]; UIImage *net = [UIImage imageNamed:@"e.png"]; UIImage *photo = [UIImage imageNamed:@"f.png"]; UIImage *psd = [UIImage imageNamed:@"g.png"]; UIImage *vector = [UIImage imageNamed:@"h.png"]; NSArray *images = [[NSArray alloc] initWithObjects: active, ae, audio, mobile, net, photo, psd, vector, nil]; self.imagesArray = images; [images release]; [super viewDidLoad]; } #pragma mark - #pragma mark Table View datasource methods // Required Methods // Return the number of rows in a section -(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section { return [sitesArray count]; } // Returns cell to render for each row -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; } // Configure cell NSUInteger row = [indexPath row]; // Sets the text for the cell //cell.textLabel.text = [sitesArray objectAtIndex:row]; // Sets the imageview for the cell cell.imageView.image = [imagesArray objectAtIndex:row]; // Sets the accessory for the cell cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; // Sets the detailtext for the cell (subtitle) //cell.detailTextLabel.text = [NSString stringWithFormat:@"This is row: %i", row + 1]; return cell; } // Optional // Returns the number of section in a table view -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { return 1; } #pragma mark - #pragma mark Table View delegate methods // Return the height for each cell -(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 78; } // Sets the title for header in the tableview -(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return @"Decors"; } // Sets the title for footer -(NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { return @"Decors"; } // Sets the indentation for rows -(NSInteger) tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath { return 0; } // This method is run when the user taps the row in the tableview -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Tapped row!" message:[NSString stringWithFormat:@"You tapped: %@", [sitesArray objectAtIndex:indexPath.row]] delegate:nil cancelButtonTitle:@"Yes, I did!" otherButtonTitles:nil]; [alert show]; [alert release]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } #pragma mark - #pragma mark Memory management - (void)didReceiveMemoryWarning { NSLog(@"Memory Warning!"); [super didReceiveMemoryWarning]; } - (void)viewDidUnload { self.table = nil; self.sitesArray = nil; self.imagesArray = nil; [super viewDidUnload]; } - (void)dealloc { [table release]; [sitesArray release]; [imagesArray release]; [super dealloc]; } @end
Part where the Alert is
// This method is run when the user taps the row in the tableview -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Tapped row!" message:[NSString stringWithFormat:@"You tapped: %@", [sitesArray objectAtIndex:indexPath.row]] delegate:nil cancelButtonTitle:@"Yes, I did!" otherButtonTitles:nil]; [alert show]; [alert release]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; }
-
Blake Loizides over 11 yearsi,m a bit confused? How does it know which viewcontroller to go to?Must I duplicate the code above for each image? In the alert in my app the stringWithFormat:@"You tapped: %@" tells me which image is clicked. [NSString stringWithFormat:@"You tapped: %@", [sitesArray objectAtIndex:indexPath.row] So Understand the alert but still having trouble with with linking the table
-
chown over 11 yearsCheck out my updates. You can show a different controller based on the indexPath. Can even use the same controller, but set properties of its view to different values based on section/row.
-
Blake Loizides over 11 yearsStill busy working the code in. I will let you know as soon as I come right. But this seems right and I understand it. thank You.
-
Blake Loizides over 11 yearsI now understand the code, But because i,m new to xcode I dont understand the relationship between the viewcontrollers and the nib files I have to setup. If you take a look at my link where my project is you can run my Test project that I edited to my needs. Maybe you please help me with edit my project to help me learn how you link about the interface builder items with the code.I would be extremely grateful to you for this. I have made a tabbed bar application and intent on integrating this code into my project. www.blakeloizides.co.za/table.zip, This practical help will go
-
Blake Loizides over 11 yearsa long way in helping me understand.
-
chown over 11 years
-
Blake Loizides over 11 yearsThanks for the help. Your answer above is most accurate to all my problems and is really useful. I've started to figure everything out now. Thanks again.
-
chown over 11 yearsVery cool! Glad I could help. You will start to enjoy Objective-c...eventually ;).