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;
}
Share:
10,760
Blake Loizides
Author by

Blake Loizides

My name is Blake

Updated on June 28, 2022

Comments

  • Blake Loizides
    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

    enter image description here

    enter image description here

    #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
    Blake Loizides over 11 years
    i,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
    chown over 11 years
    Check 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
    Blake Loizides over 11 years
    Still 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
    Blake Loizides over 11 years
    I 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
    Blake Loizides over 11 years
    a long way in helping me understand.
  • chown
    chown over 11 years
  • Blake Loizides
    Blake Loizides over 11 years
    Thanks 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
    chown over 11 years
    Very cool! Glad I could help. You will start to enjoy Objective-c...eventually ;).