10

私のアプリは、さまざまな属性を Core Data オブジェクトに格納します。それらはすべて UITableView に表示され、セルをクリックすると DetailView が表示されます。Master-Detail-XCode-Template のような通常のもの。

今度は、peek と pop で 3D Touch を実装したいと思います。メール アプリのように、セルを 3D タッチしてプレビューを取得し、さらに深く押して、詳細を表示します。

これまでのところうまくいきましたが、対応するデータを渡す方法がわかりません

- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit

他の DetailViewController に。

セルをクリックするだけで(3Dタッチなし)、データを引き渡します

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    [[segue destinationViewController] setDetailItem:object];

私は使用しています

id detailItem

すべてのViewControllerで、対応するオブジェクトをそれに設定します。

だから私は仕事に似たものを手に入れようとするので、私のDetailViewControllerで私の「detailItem」は選択された(3Dタッチされた)セルから対応するCore Dataオブジェクトを必要とします。

手伝ってくれてありがとう !

4

3 に答える 3

8

セルから新しいビュー コントローラーへのストーリーボード セグエを使用している場合、送信者はテーブル ビュー セルです。

したがって、次のように実装できますprepareForSegue:

- (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
    }
}
于 2015-11-06T22:28:51.050 に答える
2

Dheeraj の返信に基づいて、いくつかのコードを調整して、テーブルビュー セルの間違ったタッチ位置を修正します。type という名前の値を宛先コントローラーに渡す必要があるとします。

- (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;

}

于 2015-10-10T14:28:54.440 に答える