2015-03-19 51 views
0

我有一个表格视图与自定义单元格。在单元格上有用标签标识的按钮。 每个按钮都执行一个动作。例如:传递按钮标签来执行segue标识符

-(void)mapa_button_action:(UIButton*)sender 
{ 
    NSLog(@"CANCELAR BUTTON CLICKED=%ld",(long)sender.tag); 
    NSString *employee =[[historialServicios objectAtIndex:sender.tag] valueForKey:@"driverId"]; 
    NSLog(@"EMPLOYEE=%@",employee); 
    [self performSegueWithIdentifier:@"mapa_conductor_segue" sender:self]; 

} 

正如您所看到的,该按钮由sender.tag属性标识。 在这种情况下,动作执行一个segue,然后执行prepareForSegue方法,我可以将变量传递给新的视图控制器。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"mapa_conductor_segue"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     NSLog(@"INDEXPATH=%@",indexPath); 
    } 
} 

我需要的是从选定的单元格中检索值到新的视图控制器。 我能够在map_button_action方法中获取值,但我不知道如何将这些值传递给新控制器。

我必须使用performSegueWithIdentifier操作来维护视图控制器结构,我正在使用SWRevealViewControllers。

任何帮助,欢迎。

回答

3

当您调用performSegueWithIdentifier:sender时,您正在传递一个无用的参数作为发件人。如果你想让按钮的标签在prepareForSegue中可用,那么将该标签(转换为NSNumber)设置为发送者 - 你可以在该参数中传递你想要的任何对象,并且它将成为prepareForSegue中的发送者。

-(void)mapa_button_action:(UIButton*)sender 
{ 
    NSLog(@"CANCELAR BUTTON CLICKED=%ld",(long)sender.tag); 
    NSString *employee =[[historialServicios objectAtIndex:sender.tag] valueForKey:@"driverId"]; 
    NSLog(@"EMPLOYEE=%@",employee); 
    [self performSegueWithIdentifier:@"mapa_conductor_segue" sender:@(sender.tag)]; 

} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(NSNumber *)sender { 
    NSInteger tag = sender.integerValue; 
    // do whatever you need to with the tag 
    if ([segue.identifier isEqualToString:@"mapa_conductor_segue"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     NSLog(@"INDEXPATH=%@",indexPath); 
    } 
} 
+0

谢谢你,但实施你的建议,我不需要if行。我只需要声明端视图控制器并将值传递给那里,对吗? – mvasco 2015-03-19 04:53:56

+0

@mvasco,我只是复制你的代码,所以我认为这就是你想要的。你不需要if子句,如果你只有一个segue,但你会如果有多个segues .. – rdelmar 2015-03-19 04:54:54

+0

@rdelmar我只是好奇,你是如何获取'indexPathForSelectedRow' – 2015-03-19 04:59:05

1

试试这个

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if ([segue.identifier isEqualToString:@"mapa_conductor_segue"]) { 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    NSLog(@"INDEXPATH=%@",indexPath); 
    DestinationViewController *objeDest=segue.destinationViewController; 
    objeDest.destinationIndexPath=indexPath 

} 
} 
+0

谢谢,INDEXPATH =(null)的日志。正如我的例子。 – mvasco 2015-03-19 04:45:49

1

在目标ViewController创建一个属性(你需要在数据传递的类型)。您可以在当前的ViewController中创建目标控制器的对象,并在map_button_action方法中设置此对象的值以执行所需操作。

//DestinationViewController.h 

@interface DestinationViewController : UIViewController 

@property (nonatomic,strong) (SomeDataType*) propertyName; 

@end 

//CurrentViewController.m 

#import DestinationViewController 

.... 

map_button_action{ 

    DestinationViewController *obj = [DestinationViewController new]; 
    obj.propertyName = someValue; 
    [self.navigationController pushViewController:obj animated:YES] 

} 
+0

谢谢,但你介意给我一个你的建议的代码示例吗? – mvasco 2015-03-19 04:46:44

+0

我刚刚编辑了我的答案 – 2015-03-19 04:53:59

+0

谢谢,但使用您的建议SWRevealViewControllers结构会丢失。 – mvasco 2015-03-19 04:55:05