如何执行一个模式继续长按

我有一个tableview,我想当我触摸单元格导航到editViewController,当我长触摸(触摸和等待)单元格导航到DetailsViewController。 我在这里得到了这个问题的答案。


现在我有另一个问题,我使用下面的代码将选定的行传递给detailViewContoler

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender if([[segue identifier] isEqualToString:@"ContectDetails"]) { //get selected contact NSManagedObject *selectedContact=[contacts objectAtIndex:[[self.tableView indexPathForSelectedRow] row]]; //pass selected contact to MyContactAppViewController for editing ContactDetailsViewController *destViewcontroller=segue.destinationViewController; destViewcontroller.contact=selectedContact; //contact is my core data object } } 

现在我需要创build一个模式segue和长按方法设置segue标识符“ContectDetails”。

在你的表视图的视图控制器和ContactDetailsViewController之间的故事板中创build一个segue,并在属性检查器中命名它(假设你将其命名为“ContactDetailsModalSegue”)。

然后在手势识别器处理程序方法中,您可以像这样调用segue:

 -(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { [self performSegueWithIdentifier:@"ContactDetailsModalSegue" sender:self]; } 

在这种情况下, self应该是您的表视图所在的视图控制器。如果您正在处理表视图单元类中的长按,则应该对表视图的视图控制器保留一个弱引用,并相应地进行重构:

在你的表格视图单元格的.h文件中包含一个指向父vc的指针:

@property (weak, nonatomic) UIViewController *vc;

确保您在表视图委托中设置它时传递对单元格的引用:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; cell.vc = self; //Assuming your datasource is in the view controller file (adjust if necessary) } 

最后在tableview单元格的.m文件中,使用指向vc的指针调用segue:

 -(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { [self.vc performSegueWithIdentifier:@"ContactDetailsModalSegue" sender:self]; } 

更新:为了将用于填充表格视图单元的数据的引用传递给destinationViewController,可以执行以下操作:

首先,确保数据存储在自定义表视图单元格子类.h文件中的模型对象中。 对于这个例子,我正在使用一个NSManagedObject,因为那是什么在你的问题,但其他人读这可以交换出这与任何模型对象(例如一个NSObject的子类):

@property (strong, nonatomic) NSManagedObject *managedObject;

请注意,在performSegueWithIdentifier:方法调用中,您将传递给self的引用作为sender参数。 您为sender参数指定的对象将作为parameter passing给- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法。 这使您可以检索刚刚添加到自定义表格视图单元格的公共属性,如下所示:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { //Verify segue identifier if([[segue identifier] isEqualToString:@"ContactDetailsModalSegue"]) { //Protect yourself from unrecognized selector errors in case you reuse this segue if ([sender isKindOfClass:[YourCustomTableCellClass class]] && [segue.destinationViewController respondsToSelector:@selector(setContact:)]) { //get selected contact NSManagedObject *selectedContact= (YourCustomTableCellClass *)sender.managedObject; //pass selected contact to ContactDetailsViewController for editing ContactDetailsViewController *destViewController= segue.destinationViewController; destViewController.contact = selectedContact; } } } 

replace[self.navigationController pushViewController:detailView animated:YES]; [self.navigationController presentModalViewController:detailView animated:YES completion:nil]; 在该方法中

 -(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { }