【问题标题】:how to perform a modal segue for long press如何为长按执行模态转场
【发布时间】:2014-08-28 06:20:39
【问题描述】:

我有一个表格视图,当我触摸要导航到 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
 }
}

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

【问题讨论】:

    标签: ios objective-c iphone uitableview


    【解决方案1】:

    在情节提要中,在表格视图的视图控制器和 ContactDetailsViewController 之间创建一个转场,并在属性检查器中将其命名(假设您将其命名为“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 cell的.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;
            }
        }
    }
    

    【讨论】:

    • 感谢它的工作,但在 prepareForSegue 方法中,我需要将选定的单元格传递给 detailviewcontroller,当我长按单元格时,它不是选定的单元格。这个问题有解决办法吗?
    • 检查更新的答案并将其标记为正确,谢谢!
    • 感谢 BFar 但我找不到答案。请查看this post
    【解决方案2】:

    将方法中的[self.navigationController pushViewController:detailView animated:YES];替换为[self.navigationController presentModalViewController:detailView animated:YES completion:nil];

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

    【讨论】:

    • 这是不正确的,presentModalViewController 自 iOS 6 以来已被弃用。see this answer
    猜你喜欢
    • 2012-03-16
    • 2016-06-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 2013-03-16
    • 2018-11-19
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多