在情节提要中,在表格视图的视图控制器和 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;
}
}
}