3D Touch Peek and Pop from UITableViewCell how to hand over data to other UIViewController?

前端 未结 3 498
天命终不由人
天命终不由人 2020-12-14 11:59

my app stores different attributes in Core Data objects. They are all shown in a UITableView, if you click a cell, a DetailView is shown. the usual stuff like in the Master-

相关标签:
3条回答
  • 2020-12-14 12:28

    Get the destination View controller from the storyboard using its storyboard ID and pass the objects that you are doing in prepareForSegue method.

    Below is the code that I use to pass the data. Its in Swift, it should be similar in objective C. Let me know if you want Objective C version.

    func previewingContext(previewingContext: UIViewControllerPreviewing,viewControllerForLocation location: CGPoint) -> UIViewController? method:
    
        // Obtain the index path and the cell that was pressed.
        guard let indexPath = tableView.indexPathForRowAtPoint(location),
                  cell = tableView.cellForRowAtIndexPath(indexPath) else { return nil }
    
        // Create a destination view controller and set its properties.
        guard let destinationViewController = storyboard?.instantiateViewControllerWithIdentifier("DestinationViewController") as? DestinationViewController else { return nil }
        let object = fetchedResultController.objectAtIndexPath(indexPath)
        destinationViewController.detailItem = object
    
        /*
            Set the height of the preview by setting the preferred content size of the destination view controller. Height: 0.0 to get default height
        */
        destinationViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0)
    
        previewingContext.sourceRect = cell.frame
    
        return destinationViewController
    }
    
    0 讨论(0)
  • 2020-12-14 12:30

    Base on Dheeraj's reply, adjust some code to rectify the wrong touch location of tableview cell. Assume we need pass the value named type to destination controller.

    - (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    // check if we're not already displaying a preview controller
    if ([self.presentedViewController isKindOfClass:[DetailViewController class]]) {
        return nil;
    }
    
    CGPoint cellPostion = [self.tableview convertPoint:location fromView:self.view];
    NSIndexPath *path = [self.tableview indexPathForRowAtPoint:cellPostion];
    
    if (path) {
        UITableViewCell *cell = [self.tableview cellForRowAtIndexPath:path];
        type = [[self.data objectAtIndex:path.row] integerValue];
        // shallow press: return the preview controller here (peek)
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        DetailViewController *previewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
        previewController.type = type;
        previewingContext.sourceRect = [self.view convertRect:cell.frame fromView:self.tableview];
        return previewController;
    }
    return nil;
    

    }

    0 讨论(0)
  • 2020-12-14 12:32

    If you are using storyboard segues from the cell to the new view controller, the sender is the table view cell.

    So you could implement prepareForSegue: as such:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
        if ([sender isKindOfClass:[UITableViewCell class]]) {
    
            UITableViewCell *cell = sender;
            NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    
            id viewController = segue.destinationViewController;
    
            // Get your data object
            // Pass it to the new view controller
        }
    }
    
    0 讨论(0)
提交回复
热议问题