Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling a New View when selecting a Row in a 'UITableView'

I am currently writing my first iPhone app, but have encountered an issue. I have a view which contains a UITableView. This is the first time that I have attempted this, and this is the behaviour that I am trying to achieve:

When the user selects one of the rows, I would like this to call a new view, taking the user to a different page displaying info in reference to what they have selected.

I have it currently, so when the user selects a row it displays a UIAlert in the same view, but this doesn;t suit my needs. I have set the UITableView up through interface builder, and inputted the following code into my .m file to set it up.

- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section {
    //return the value
    return 10;
}

//now we define the cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Identifier for retrieving reusable cells.
    static NSString *cellIdentifier = @"MyCellIdentifier";

    // Attempt to request the reusable cell.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    // No cell available - create one
    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                      reuseIdentifier:cellIdentifier];
    }

    // Set the text of the cell to the row index.
    cell.textLabel.text = [NSString stringWithFormat:@"iPad %d", indexPath.row];

    return cell;
}

This creates a list of ten rows. The following codes gives me my UIAlert when tapped, however, I want to remove this and make it call a new view of my choice;

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

    // Show an alert with the index selected.
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"iPad Selected"                         
                          message:[NSString stringWithFormat:@"iPad %d", indexPath.row]                     
                          delegate:self       
                          cancelButtonTitle:@"OK"           
                          otherButtonTitles:nil];
    [alert show];
    [alert release];   

}

Can anyone help with this last piece of code? the view I want it to call is called 'ProteinView'.

like image 980
Paul Morris Avatar asked Apr 20 '11 00:04

Paul Morris


People also ask

Which method is used to allow moving of row in UITableView?

moveRow(at:to:) Moves the row at a specified location to a destination location.

How do you get the IndexPath row when a button in a cell is tapped?

add an 'indexPath` property to the custom table cell. initialize it in cellForRowAtIndexPath. move the tap handler from the view controller to the cell implementation. use the delegation pattern to notify the view controller about the tap event, passing the index path.

What is table View delegate?

func tableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath) Tells the delegate the table view is about to draw a cell for a particular row. func tableView(UITableView, indentationLevelForRowAt: IndexPath) -> Int. Asks the delegate to return the level of indentation for a row in a given section.


1 Answers

Alrighty, what we need to do is use one of the UITableView methods that are already readily available to us. We'll do the following.

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

ProteinView *detailViewController = [[ProteinView alloc] initWithNibName:@"ProteinView" bundle:nil];

        // It is here we'd pass information from the currently selected UITableViewCell to the ProteinView.
        // An example of this is the following.

        // I would do it like this, but others would differ slightly.
        NSString *titleString = [[[NSString alloc] initWithFormat:@"iPad %d",indexPath.row] autorelease];

        // title is an object of detailViewController (ProteinView). In my own instances, I have always made a NSString which in viewDiDLoad is made the self.navigationBar.title string. Look below for what my ProteinView.m and .h would look like.
        detailViewController.stringTitle = titleString;
        // ...
        // Pass the selected object to the new view controller.
        [self.navigationController pushViewController:detailViewController animated:YES];
        [detailViewController release];
}

EDIT

// -------- ProteinView.m -------- //

- (void)viewDidLoad {

[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

// Here we set the navigationItem.title to the stringTitle. stringTitle is declared in the .h. Think of it as a global scope variable. It is also propertised in the .h and then synthesized in the .m of ProteinView. 
self.navigationItem.title = stringTitle;
}

I haven't compiled this, so I don't know if it'll fully work. But that is definitely the fastest and most easiest way to do it!

like image 118
Sebastien Peek Avatar answered Oct 05 '22 23:10

Sebastien Peek