Search code examples
iosuitableviewsegueuistoryboardsegue

Seguing data from one UITableViewController to another UITableViewController via performSelector:withObject:


So what I am trying to do is I have an NSMutableArray of data I need to pass to another UITableViewController. This NSMutableArray is an array of NSDictionaries that contain the information I want to be displayed in the title of each table view cell. Here is my code before I segue.

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath* indexPath = [self.tableView indexPathForCell:sender];

    if ([segue.identifier isEqualToString:@"Title Query"]) {

        UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
        NSString* cellText = cell.textLabel.text;
        NSMutableArray* photosToBeShown = [self titleQuery:cellText];

          if ([segue.destinationViewController respondsToSelector:@selector(setPhotoTitles:)]) {
              [segue.destinationViewController performSelector:@selector(setPhotoTitles:) withObject: photosToBeShown];
              NSLog(@"%@", photosToBeShown);
          }      
    }

}

The method setPhotoTitles: that is called by the performSelector: withObject: is the setter of the property (NSMutableArray* ) photoTitles on the UITableViewController that I am seguing to because I wanted to collect the array so I could then call the methods below to set the titles of my table view cells.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Photo Title Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.textLabel.text = [self titleForRow:indexPath.row];

    return cell;
}
- (NSString *) titleForRow: (NSUInteger) row
{
    return self.photoTitles[row];
}

What happens when I run this code is I end up in an infinite loop with calls to my setter method (setPhotoTitles:). Now my question is what is the right conceptual way to get around this problem or how can I implement it this way without ending up in an infinite loop. I have all the information I need in my array but I need to pass the array to the new controller but also be able to use the UITableViewCell method to set the rows titles.


Solution

  • In the prepareForSegue: method, rather than overriding setPhotoTitles:, you should create a NSArray property in the destination view controller, as pass the photoTitles array to the NSArray property of the destination view controller. So your prepareForSegue method would look like this:

    - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        NSIndexPath* indexPath = [self.tableView indexPathForCell:sender];
    
        if ([segue.identifier isEqualToString:@"Title Query"]) {
    
            UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
            NSString* cellText = cell.textLabel.text;
            NSMutableArray* photosToBeShown = [self titleQuery:cellText];
    
            YourCustomViewController *customViewController = segue.destinationViewController;
            customViewController.photosArrayProperty = photosToBeShown;
        }
    
    }