Pergunta

I have a UITableView, which when I select a row, I want to segue to another view, where the details of the tank are displayed... The segue happens, but the delegate does not send the object etc over... I think I have my knickers in a twist over where the delegate is declared/synthesized and implemented etc...

Here is where I declare the delegate in the header file of the UITableViewController:

@class iTanksV2ListViewController;
@protocol iTanksV2ListViewControllerDelegate
- (void) iTanksListViewController:(iTanksV2ListViewController *) sender choseTank:(tank *)tank;
@end
@interface iTanksV2ListViewController : UITableViewController
@property (weak, nonatomic) id <iTanksV2ListViewControllerDelegate> delegate;
@end

and this is what I have in the UITableViewControllers m file:

@implementation iTanksV2ListViewController
@synthesize delegate = _delegate;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tankTableView.delegate = self;
    self.tankTableView.dataSource = self;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.selectedTank = [self.tanks objectAtIndex:indexPath.row];
    [self.delegate iTanksListViewController:self choseTank:self.selectedTank];
}

...and then here is the code I have for the delegate in the DetailViewController implementation file...

@interface tankDetailViewController () <iTanksV2ListViewControllerDelegate>
@end

-(void)iTanksListViewController:(iTanksV2ListViewController *)sender choseTank:(id)tank
{
    self.tankToShow = tank;
}

All the other variables etc are declared, I have left them out in the hope it makes things clearer - the code compiles, and the segue happens but the delegate doesn't seem to do anything!!!

Foi útil?

Solução

You mention segues so I'm assuming you're using a storyboard. If that's true, forget about delegates for this purpose. A delegate is supposed to be an object that performs some action for another but all you need is data transfer.

I suggest using the prepareForSeque: method instead in your iTanksV2ListViewController class. Keep the line that sets self.selectedTank when a row is tapped but then put something like this in prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    tankDetailViewController *next = (tankDetailViewController *)[segue destinationViewController];
    next.tankToShow = self.selectedTank;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top