简体   繁体   中英

update a UILabel when the cell in UITableView is selected

A really simple question here. I have a label on one view and a UITableView on the previous view. I have got a segue triggered when the user selects the row and I want the label to be updated with the text from that row. Here's one example, the code is pretty obvious.

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

NSString *countrySelection;

switch (indexPath.section) {

    case kFirstSection:
        countrySelection = [[NSString alloc]
                            initWithFormat:@"The country you have chosen is %@",
                            [self.MyCountries objectAtIndex: indexPath.row]];
        [self performSegueWithIdentifier:@"doneResults" sender:self];
        self.countryResult.text = countrySelection;
break;

The label isn't updated and I just don't know what should be done.

Thanks in advance!

These kind of things really need to be set on the View Controller that owns them. Use a public property to pass the value of the selected country to that view controller as outlined below:

First, create a property called something like:

@property(non atomic,strong) NSString *countryChosen;

in the destination View Controller, and make sure to @synthesize it

No reason to create another property for the IndexPath. Just use

// Pass along the indexPath to the segue prepareForSegue method, since sender can be any object
[self performSegueWithIdentifier:@"doneResults" sender:indexPath]; 

in the didSelectRowAtIndexPath method.

Then in the prepareForSegueMethod :

MyDestinationViewController *mdvc = segue.destinationViewController;
NSIndexPath *indexPath = (NSIndexPath *)sender;

mdvc.countryChosen = [self.MyCountries objectAtIndex: indexPath.row]];

On the viewDidLoad event of the Destination VC, just use:

self.countryResult.text = countryChosen;

* EDIT * To deal with a datasource that has multiple sections, just use the same logic that you have in the cellForRowAtIndexPath .

N SDictionary *selRow = [[self.countriesIndexArray valueForKey:[[[self.countriesIndexArray allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:sindexPath.row];

Change this to suit your needs, but basically you are implementing the same logic that you would to display a cell, except you are specifying the indexPath (both section and row) that you want.

Then something like the following to set that property on the destination VC:

self.countryResult.text = [selRow valueForKey@"Country"];

In your current view controller create a new property for the indexPath of the cell the user selected, like this:

@property(strong,nonatomic) NSIndexPath *path;

@synthesize it and then when a user selects a row, set it by using

self.path = indexPath;

When you perform a segue, it will always call

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

So what you can do now when prepareForSegue: gets called, is the following:

/* if this is not the only segue you are performing you want to check on the identifier first to make sure this is the correct segue */
NSString *countrySelection = [[NSString alloc]
                        initWithFormat:@"The country you have chosen is %@",
                        [self.MyCountries objectAtIndex: self.path.row]];

segue.destinationViewController.countryResult.text = countrySelection;

/* after creating the text, set the indexPath to nil again because you don't have to keep it around anymore */
self.path = nil;

For this to work the view controller you want to show after selecting the cell must have a property for the UILabel, on which you are trying to set the text.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM