2013-04-22 65 views
9

我处于一种我认为自己接近解决的情况,但也许不是。将参数传递给选择器动作

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

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

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

继承人我正在使用的代码的小snippit。

- (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.buyTicketOutlet addTarget:self action:@selector(pushToTicketURL:string) forControlEvents:UIControlEventTouchUpInside];给出错误。但是我可以编写什么工作来做我想做的事?

回答

14

虽然您无法直接将URL传递给选择器,但您可以传递按钮本身。所以我的建议是根据你的行标记按钮,创建这样的动作:

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

然后,在方法,你可以从等于按钮的标签数量的细胞“查找”网址。

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

希望有所帮助。

+1

如果您需要编写该代码的帮助,请告诉我。 – dmee3 2013-04-22 20:07:48

+0

我接受了你的建议,并找到了一个正确的代码链接来完成你所说的话。它的工作:) – jsetting32 2013-04-22 20:45:36

+2

不幸的是,我的声誉不允许我评论其他答案。 jsetting32,你提供的代码片段确实很棒,甚至比做标签更好。伟大的工作^^ 关于下面的论点,罗布纳皮尔提出了一个很好的观点。我实际上使用他的方法处理大量的数据结构,因为它更加有组织。但既然你最终使用超级景观而不是标签,我会说不改变任何东西。这是伟大的! – dmee3 2013-04-22 21:52:15

4

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

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

基本上:意味着要传递一个arguement到选择器和在接收端可以定义与该对象的选择方法。

+1

我不知道。那很整齐。谢谢你的提示。 – 2013-04-22 20:57:06

+2

这是如何回答这个问题的? – newacct 2013-04-22 22:40:02

+2

是什么让你认为它不能达到解决问题的目的?这个地方是为了帮助你解决问题,而不是写所有的代码,如果你仔细阅读了这个问题,OP在传递参数的时候会遇到问题。 – nsgulliver 2013-04-22 22:52:07

1

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

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

+0

哪种方式更好?我其实刚刚通过使用fDmitry的想法完成了任务,发现了几个允许我实现他的伪注释的链接:)。但是您的解决方案更高效吗?我想尝试做你自己的方式,但有必要走你的建议路径吗?而当你的意思更现代化时,你的意思是苹果开发者通常会用你的方式?感谢您的洞察力:) – jsetting32 2013-04-22 20:49:04

+1

“更好”的判断是可维护性和可读性。使用标签进行处理将URL列表放入IBAction中。使用关联的对象会将逻辑置于创建视图的位置。关联对象消除了将“随机数”(标记)映射到URL的需求,因为它们直接将视图绑定到URL。在大多数情况下,这更容易阅读和维护。但这并不意味着如果标签运行良好(标签具有可在IB中设置的优势)就不会出错。这个层面的效率是无关紧要的;做你的代码容易理解的地方。 – 2013-04-22 20:54:40

+1

当我说“现代”时,我的意思是“从10.6和iPhoneOS 3.1开始”。所以,在过去的4年左右。如果你维护比这更早的东西(和我一样),那么关联的对象可能不可用。 – 2013-04-22 20:59:52

4

指的fDmitry的回应,

下面是我用他的解释的全部代码。它工作正常:)。谢谢奥马尔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]; 
} 

上的这段代码帮助了我这么多,希望它可以帮助其他人,其落入了同样的问题:)。

+1

啊,你把数据粘贴到单元格本身上。我记得每个按钮都需要一个单独的URL。你的方法很好,而且很容易维护。 – 2013-04-22 21:03:06

+1

这是一种脆弱的 - 它依赖于按钮的视图层次结构 – newacct 2013-04-22 22:41:41