Ios 将参数传递给选择器操作
我现在的处境是,我认为我已经接近解决问题了,但也许不是 我有一个自定义tableview单元格的tableview 目前每个tableviewcell都有3个UIButton,访问它们并赋予它们功能是没有问题的 我使用的三个按钮中的一个有问题。该按钮将用户从当前导航控制器推送到webview控制器,但我希望webview控制器是当前tableview单元格所持有的http地址 下面是我正在使用的一小部分代码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
- (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];
}