将parameter passing给select器动作

我正处于一种我认为自己接近解决的情况,但也许不是。

我有一个自定义tableview单元格的tableview。

目前每个tableviewcell有3个uibuttons,访问它们并赋予它们function是没有问题的。

我遇到问题的3个button之一。 该button将用户从当前的导航控制器推到一个webview控制器,但我希望webview控制器是当前tableview单元格持有的http地址。

下面是我正在使用的代码的一小部分。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *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; NSString *string = event.ticketURL; [cell.buyTicketOutlet addTarget:self action:@selector(pushToTicketURL:string) forControlEvents:UIControlEventTouchUpInside]; //[cell.AddEventOutlet addTarget:self action:@selector(:) forControlEvents:UIControlEventTouchUpInside]; //cell.textLabel.numberOfLines = 2; return cell; } - (void) pushToTicketURL:(NSString *)string { UIViewController *webViewController = [[UIViewController alloc] init]; webViewController.title = @"Tickets"; UIWebView *uiWebView = [[UIWebView alloc] initWithFrame: CGRectMake(0,0,320,370)]; [uiWebView loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithString:string]]]; [webViewController.view addSubview:uiWebView]; [uiWebView release]; [self.navigationController pushViewController:webViewController animated:YES]; NSLog(@"Button pressed"); } 

我已经看到了同样的问题上的其他一些评论,但就像我说的,我只需要传递一个参数给select器,我知道这是不可能的,但是我可以采取什么其他方式来解决这个问题?

也许我的问题措辞不妙:/。

任何帮助将是伟大的:)

编辑:我明白[cell.buyTicketOutlet addTarget:self action:@selector(pushToTicketURL:string) forControlEvents:UIControlEventTouchUpInside]; 给出错误。 但是,我可以编写什么代码来做我想要的?

虽然您无法直接将URL传递给select器,但您可以传递button本身。 所以我的build议是根据你的单元格行标记button,并创build如下的动作:

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

然后,在这种方法中,您可以从单元格中查找url,其中的编号等于button的标记。

除此之外,我相当确定在button的select器中传递自定义参数或多个参数是不可能的。 如果我错了,请纠正我。

希望有所帮助。

您只需要:如果您需要传递一个参数,则将parameter passing给select器时。

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

基本上:意味着你将一个parameter passing给select器,在接收端你可以用对象来定义你的select器方法。

参考fDmitry的回应,

以下是我用于解释的完整代码。 它工作正常:)。 感谢Omar Abdelhafith,他的链接帮助了我,fDmitry让我走上正轨:)

 -(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 URLWithString:cell.EventTicketURL]]]; [webViewController.view addSubview:uiWebView]; [uiWebView release]; [self.navigationController pushViewController:webViewController animated:YES]; } 

这段代码帮助了我很多,希望能帮助其他人陷入同样的​​问题:)。

fDmitry的方法并不糟糕,但现代ObjC中有更好的方法。 使用关联的对象,你可以附加任意对象(即你的URL)到其他对象(即你的button)。 你可以询问发件人(button)的URL并处理它。 以下是一种方法:

 // 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); } 

这样,在导入你的类别之后,你可以调用[button setMYURL:]来设置button上的URL。 然后你可以使用[sender MYURL]在IBAction中获取它。