views:

202

answers:

1

I have a uitableview that is populated from a sqlite query.

I want to select or click on a row and then display that row's value in a uilabel field. To show the user that the row was selected.
I also want to pass that value on to different controllers that will be called later.

Here is a copy of my cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"psystem";
    PSystem *psystem = [self.ppdm_systems objectAtIndex:indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Set up the cell...
    // self.accessoryType = UITableViewCellAccessoryCheckmark;
    cell.textLabel.text = psystem.system_id; 
    return cell;
}

I took out the _label.text .... in my various experiments.

Now what is not working is the passing of the value to different controllers.

Using the example listed here, the source controller is TableViewController and is where the value is set. The target controller is DetailViewController.
I can pass the title of the tab bar in, but that's from TableView --> DetailView.
I am not sure how to pull from tableview; ie: Tableview <-- DetailView when I am in DetailView.

thx

+1  A: 

In your UIViewController, implement:

- (MyObject *)valueForSelectedRow {
    MyCell *cell = (MyCell *)[self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]];
    return cell.myObject;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Get value
    MyObject *object = [self valueForSelectedRow];

    // Update the label, assumed that _label is a pointer to a UILabel view object.
    _label.text = object.myValue;
}

When you want to push a new view controller, you just call -valueForSelectedRow and then use that value to push the controller.

This is assumed that you have a UITableViewCell subclass, with a property set to some model object. When you don't have that and just set the text property, that NSString object will be your 'model' object, although it would be easier when your cells handle custom model objects.

EDIT: Thanks for editing your answer. I now have the information I need. In this line: cell.textLabel.text = psystem.system_id, you setup the cell by simply setting the textLabel's text property. This is what I described in the paragraph above. I always create a UITableViewCell subclass, with a property set the the complete PSystem object. When you assign a PSystem object to the cell, it will handle it's contents, so you can easily manage your view in the, well, view. That's a very compelled approach since you never have to look at the controller again to alter the view's contents.

However, it can be done the way you currently have it. It would look something like:

- (NSString *)valueForSelectedRow {
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]];
    return cell.textLabel.text;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Get value
    NSString *value = [self valueForSelectedRow];

    // Update the label, assumed that _label is a pointer to a UILabel view object.
    _label.text = value;
}

In this case, your PSystem model has been replaced with an NSString object. For this, it's enough, but it could be so much easier to have the object itself. Okay, that can also be done by selecting the PSystem object again from the p_system array by the NSIndexPath, but things will become harder once you come up with more complex tableviews.

JoostK
wow, your answer shows how much I have yet to learn. Using this declaration: static NSString *CellIdentifier = @"psystem"; PSystem *psystem = [self.p_system objectAtIndex:indexPath.row];what would I change the 'MyObject' etc to?
Wes
So `PSystem` is probably your model object. With the given `CellIdentifier` you are dequeueing/creating a `UITableViewCell` object, and then you set that `PSystem` object to your cell. Can you provide the complete `-tableView:cellForRowAtIndexPath:` in your question?
JoostK
See my answer, edited it to match your context.
JoostK
That did the trick.I have another problem, seems to be related to not understanding how these objects pass values back/forth. I created a custom cell to display a couple of lines of info. What I want to do is colour the letters according to a value from the db query. What I have is this: if ([gType.text isEqualToString:@"BUSINESS"]) { gID.textColor = [UIColor blackColor]; gName.textColor = [UIColor blackColor]; } thx
Wes
Got this one as well.Finally.
Wes