我有一个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”。
答案 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;
}
}
}