如何执行长按的模态segue

时间:2014-08-28 06:20:39

标签: ios objective-c iphone uitableview

我有一个tableview,我希望当我触摸要导航到editViewController的单元格时,以及当我长时间触摸(触摸并等待)单元格以导航到DetailsViewController时。 我得到了这个问题的答案here


现在我有另一个问题,我使用以下代码将所选行传递给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
 }
}

现在我需要创建一个模态segue并在长按方法中将segue标识符设置为“ContectDetails”。

2 个答案:

答案 0 :(得分:0)

在方法

中将[self.navigationController pushViewController:detailView animated:YES];替换为[self.navigationController presentModalViewController:detailView animated:YES completion:nil];
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{ 
}

答案 1 :(得分:0)

在表视图的视图控制器和ContactDetailsViewController之间的storyboard中创建一个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参数指定的对象将作为参数传递给- (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;
        }
    }
}