Passer des parameters à l'action du sélecteur

Je suis dans une situation où je pense que je suis proche de résoudre, mais peut-être pas.

J'ai une tableview de cellules de tableview personnalisé.

Actuellement chaque tableviewcell a 3 uibuttons, y accéder et leur donner la fonctionnalité n'est aucun problème.

Un des 3 buttons avec lesquels j'ai des problèmes. Le button pousse l'user du controller de navigation actuel vers un controller Webview, mais je souhaite que le controller WebView soit l'adresse http que la cellule TableView actuelle contient.

Heres un petit extrait du code que j'utilise.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSSsortingng *cellIdentifier = @"Identifier"; SearchTableCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SearchTableCell" owner:nil options:nil]; //cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]; for(id currentObject in topLevelObjects) { if([currentObject isKindOfClass:[SearchTableCell class]]) { cell = (SearchTableCell *)currentObject; break; } } } Player *event = [_party.events objectAtIndex:indexPath.row]; cell.EventTitle.text = event.name; cell.EventDescription.text = event.description; cell.EventStartTime.text = event.start_date; cell.EventEndTime.text = event.end_date; cell.EventTicketURL = event.ticketURL; NSSsortingng *ssortingng = event.ticketURL; [cell.buyTicketOutlet addTarget:self action:@selector(pushToTicketURL:ssortingng) forControlEvents:UIControlEventTouchUpInside]; //[cell.AddEventOutlet addTarget:self action:@selector(:) forControlEvents:UIControlEventTouchUpInside]; //cell.textLabel.numberOfLines = 2; return cell; } - (void) pushToTicketURL:(NSSsortingng *)ssortingng { UIViewController *webViewController = [[UIViewController alloc] init]; webViewController.title = @"Tickets"; UIWebView *uiWebView = [[UIWebView alloc] initWithFrame: CGRectMake(0,0,320,370)]; [uiWebView loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithSsortingng:ssortingng]]]; [webViewController.view addSubview:uiWebView]; [uiWebView release]; [self.navigationController pushViewController:webViewController animated:YES]; NSLog(@"Button pressed"); } 

J'ai vu d'autres critiques sur la même question mais comme je l'ai dit, j'ai juste besoin de passer un paramètre à un sélecteur, je comprends que ce n'est pas possible, mais de quelles autres façons puis-je résoudre ce problème?

Peut-être que ma question est mal formulée: /.

Toute aide sera appréciée 🙂

EDIT: Je comprends [cell.buyTicketOutlet addTarget:self action:@selector(pushToTicketURL:ssortingng) forControlEvents:UIControlEventTouchUpInside]; donne des erreurs Mais quel travail puis-je coder pour faire ce que je veux?

Bien que vous ne puissiez pas passer l'URL directement au sélecteur, vous pouvez passer le button lui-même. Donc, ma suggestion serait de marquer le button en fonction de votre rangée de cellules et de créer une action comme celle-ci:

 void goToAddress: (id) sender { UIButton *button = (UIButton*) sender; if (button.tag == ..) { ... } } 

Ensuite, dans cette méthode, vous pouvez "searchr" l'URL de la cellule avec le nombre égal à l'label du button.

À part ça, je suis à peu près sûr qu'il est impossible de passer des parameters personnalisés ou plus d'un paramètre dans le sélecteur de buttons. Corrigez-moi si j'ai tort, s'il-vous plait.

J'espère que cela pourra aider.

Vous avez juste besoin de : lors du passage de paramètre à un sélecteur si vous avez besoin de passer un paramètre.

 [cell.buyTicketOutlet addTarget:self action:@selector(pushToTicketURL:) forControlEvents:UIControlEventTouchUpInside]; 

Fondamentalement : signifie que vous transmettez un argument au sélecteur et que vous pouvez définir votre méthode de sélection avec l'object.

En reference à la réponse de fDmitry,

Voici le code complet que j'ai utilisé pour son explication. Cela fonctionne phénoménalement :). Merci à Omar Abdelhafith, dont le lien m'a aidé, et à fDmitry pour m'avoir mis sur la bonne voie 🙂

 -(void)pushToTicketURL:(id)sender{ UIButton *button = (UIButton*)sender; UIView *view = button.superview; //Cell contentView SearchTableCell *cell = (SearchTableCell *)view.superview; NSLog(@"%@",cell.EventTitle.text); //Cell Text UIViewController *webViewController = [[UIViewController alloc] init]; webViewController.title = cell.EventTitle.text; [webViewController.title sizeWithFont:10]; UIWebView *uiWebView = [[UIWebView alloc] initWithFrame: CGRectMake(0,0,320,370)]; [uiWebView loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithSsortingng:cell.EventTicketURL]]]; [webViewController.view addSubview:uiWebView]; [uiWebView release]; [self.navigationController pushViewController:webViewController animated:YES]; } 

Cet extrait de code m'a beaucoup aidé et j'espère que cela aide quelqu'un d'autre qui tombe dans le même problème :).

L'approche de @DDmitry n'est pas mauvaise, et il y a de meilleurs moyens dans ObjC moderne. En utilisant les objects associés, vous pouvez attacher des objects arbitraires (c'est-à-dire votre URL) à d'autres objects (c'est-à-dire votre button). Vous pouvez requestr à l'expéditeur (le button) pour l'URL et le traiter. Voici une façon de le faire:

 // Create a category. The "MY" is just a prefix for your namespace @interface UIButton (MYURLAdditions) @property (nonatomic, readwrite, strong) NSURL *MYURL; @end // Add the information with a associated object #import <objc/runtime.h> @implementation (MYURLAdditions) static char MYURLKey; - (NSURL *)MYURL { return objc_getAssociatedObject(self, &MYURLKey); } - (void)setMYURL:(NSURL *)URL { objc_setAssociatedObject(obj, &MYURLKey, URL, OBJC_ASSOCIATION_RETAIN); } 

Avec cela, après avoir importé votre catégorie, vous pouvez appeler [button setMYURL:] pour définir l'URL sur le button. Vous pouvez ensuite utiliser [sender MYURL] pour le récupérer dans IBAction.