如何执行一个模式继续长按
我有一个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 { }