Ios 将参数传递给选择器操作

Ios 将参数传递给选择器操作,ios,objective-c,string,parameters,selector,Ios,Objective C,String,Parameters,Selector,我现在的处境是,我认为我已经接近解决问题了,但也许不是 我有一个自定义tableview单元格的tableview 目前每个tableviewcell都有3个UIButton,访问它们并赋予它们功能是没有问题的 我使用的三个按钮中的一个有问题。该按钮将用户从当前导航控制器推送到webview控制器,但我希望webview控制器是当前tableview单元格所持有的http地址 下面是我正在使用的一小部分代码 - (UITableViewCell *)tableView:(UITableView

我现在的处境是,我认为我已经接近解决问题了,但也许不是

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

目前每个tableviewcell都有3个UIButton,访问它们并赋予它们功能是没有问题的

我使用的三个按钮中的一个有问题。该按钮将用户从当前导航控制器推送到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");
}
我看过一些关于同一个问题的其他评论,但正如我所说,我只需要将一个参数传递给选择器,我知道这是不可能的,但是我可以用什么其他方法来解决这个问题呢

也许我的问题措辞不好:/

任何帮助都会很好:)


编辑:我理解
[cell.buyticketoutletaddtarget:self action:@selector(pushToTicketURL:string)for controlEvents:UIControlEventTouchUpInside]给出错误。但是,我可以编写代码来做我想做的事情吗?

如果需要传递一个参数,在将参数传递给选择器时,您只需要

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

基本上,
表示您正在将参数传递给选择器,在接收端,您可以使用对象定义选择器方法。

虽然无法将URL直接传递给选择器,但可以传递按钮本身。所以我的建议是根据您的单元格行标记按钮,并创建如下操作:

void goToAddress: (id) sender {
   UIButton *button = (UIButton*) sender;
   if (button.tag == ..) {
   ...
  }
}
然后,在该方法中,您可以从单元格中“查找”URL,其编号等于按钮的标记

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


希望这能有所帮助。

@fDmitry的方法不错,但在现代ObjC中有更好的方法。使用关联对象,可以将任意对象(即URL)附加到其他对象(即按钮)上。您可以向发件人(按钮)询问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);
}
//创建一个类别。“MY”只是名称空间的前缀
@界面UIButton(MYURLAdditions)
@属性(非原子、读写、强)NSURL*MYURL;
@结束
//添加具有关联对象的信息
#进口
@实施(MYURLAdditions)
静态字符MYURLKey;
-(NSURL*)MYURL{
返回objc_getAssociatedObject(self和MYURLKey);
}
-(void)setMYURL:(NSURL*)URL{
objc_setAssociatedObject(obj,&MYURLKey,URL,objc_ASSOCIATION_RETAIN);
}

这样,在导入类别后,您可以调用
[按钮setMYURL::
在按钮上设置URL。然后,您可以使用
[sender MYURL]
在iAction中获取它。

参考fDmitry的响应

这是我用来解释他的完整代码。它在物候方面起作用:)。感谢奥马尔·阿卜杜勒哈菲斯(Omar Abdelhafith),他的联系帮助了我,感谢fDmitry让我走上了正确的道路:)


这段代码对我帮助很大,希望它能帮助其他遇到同样问题的人:)

我采纳了你的建议,找到了代码的链接,完全按照你说的去做。很不幸,我的名声不允许我对其他答案发表评论。jsetting32,您提供的代码片段确实很棒,而且比使用标记更好。干得好关于下面的论点,罗布·纳皮尔提出了一个很好的观点。实际上,我会用他的方法处理大型数据结构,因为它更有组织性。但是,由于您最终使用了superview而不是标记,所以我建议不要更改任何内容。真是太棒了!哪条路更好?实际上,我刚刚使用fDmitry的想法完成了任务,并找到了几个链接,使我能够实现他的伪注释:)。但是,您的解决方案是否更有效?我也想按你的方式去做,但有必要按你的建议去做吗?当你指的是更现代的时候,你是指苹果的开发者通常会按照你的方式去做吗?感谢您的见解:)这里“更好”的评判标准是可维护性和可读性。使用标记将URL列表放在iAction中。使用关联对象将逻辑置于您创建视图的位置。关联对象不需要将“随机数”(标记)映射到URL,因为它们直接将视图绑定到URL。在大多数情况下,这更容易阅读和维护。但这并不意味着如果标签工作正常,就错了(标签的优点是可以在IB中设置)。这一级别的效率无关紧要;做一些让你的代码更容易理解的事情。当我说“现代”时,我的意思是“从10.6和iPhoneOS3.1开始”。所以,在过去的4年左右。如果你维护的东西比这还要旧(就像我一样),那么关联的对象可能不可用。啊,我明白了,所以我想像iPhone 3这样使用我的代码的东西是行不通的?iPhone 3G可以运行到iOS 4,所以这很好。iPhoneOS在iOS 4之前是iOS的名称。(从来没有一款设备叫做“iPhone3”)我不知道。很好。谢谢你的提示。这是如何回答这个问题的?是什么让你认为它不符合解决问题的目的?这个地方是为了帮助你解决问题,不要写所有的代码,如果你仔细阅读了这个问题,OP在将参数传递给选择器时遇到了问题。啊,你把数据粘贴到了单元格本身。我想每个按钮都需要一个单独的URL。这里的方法很好,并且很容易维护。这有点脆弱——它依赖于按钮的视图层次结构
-(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];
}