0

行をUITableViewタップすると、1 つのセクションで別のテーブルを含む popOver が表示される iPad アプリ用があります。fetchedResultsControllerpopOver テーブル セクション ヘッダーは、メインの UITableView コントローラーの値に依存します。ポップオーバーが最初に読み込まれるとき、情報は正しいです。ただし、ユーザーがポップオーバー内のセルをタップすると、データを編集できるポップオーバー内の別のビューに移動します。保存したら、デリゲート メソッドを呼び出してUITableView、ポップオーバーが表示されたままメインを更新します。次に、ユーザーがデータを編集したビューが閉じられるため、 popover に戻りUITableViewます。この時点でfetchedResultsController、 as として渡されたslotは nil になりました。なぜこれを行っているのかわかりません。

slotnow nilが入っているのはなぜSlotViewControllerですか?どうすればそれを防ぐことができますか?

@インターフェース

NSFetchedResultsController *fetchedResultsController;

メイン UITableView

@synthesize fetchResultsController = _fetchedResultsController;

- (NSFetchedResultsController *)fetchedResultsController {
    /*
     Set up the fetched results controller.
     */
    if (_fetchedResultsController != nil) {
        NSLog(@"RETURNING FETCHEDRESULTS");
        return _fetchedResultsController;
    }
    NSLog(@"Should only be called once");
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = nil;
    if ([[dataObj.client objectForKey:@"appt_method"] integerValue] == 2) {
        entity = [NSEntityDescription entityForName:@"Slots" inManagedObjectContext:[[CoreDataHelper sharedInstance] managedObjectContext]];
    } else {
        entity = [NSEntityDescription entityForName:@"Appointments" inManagedObjectContext:[[CoreDataHelper sharedInstance] managedObjectContext]];
    }
    [fetchRequest setEntity:entity];
    [fetchRequest setPredicate:nil];
    //[fetchRequest setIncludesPendingChanges:YES];

    // Set the batch size to a suitable number.
    //[fetchRequest setFetchBatchSize:20];

    // Sort using the date / then time property.
    NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
    NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start_time" ascending:YES selector:@selector(localizedStandardCompare:)];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorDate, sortDescriptorTime, nil];


    [fetchRequest setSortDescriptors:sortDescriptors];

    // Use the sectionIdentifier property to group into sections.
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[CoreDataHelper sharedInstance] managedObjectContext] sectionNameKeyPath:@"date" cacheName:nil];
//    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Slots *selectedSlot = [_fetchedResultsController objectAtIndexPath:indexPath];
    SlotViewController *slotView = [parentNav.storyboard instantiateViewControllerWithIdentifier:@"SlotViewController"];
            [slotView setSlot:selectedSlot];
    CGRect rect = [self rectForRowAtIndexPath:indexPath];
                rect.size.width = rect.size.width / 3;
                UINavigationController *navBar = [[UINavigationController alloc] initWithRootViewController:slotView];
                popOver = [[UIPopoverController alloc] initWithContentViewController:navBar];
                popOver.delegate = self;
                //[popOver setPopoverContentSize:CGSizeMake(320, 460) animated:YES];
                [popOver presentPopoverFromRect:rect inView:self permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

SlotViewController / ポップオーバー UITableView

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSLog(@"slot: %@", _slot.date);
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyyMMdd"];
    NSDate *currDate = [dateFormatter dateFromString:_slot.date];

    [dateFormatter setDateFormat:@"h:mma"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
    NSDate *midnight = [NSDate dateWithTimeIntervalSince1970:0];
    NSDate *startTimeDate = [midnight dateByAddingTimeInterval:[_slot.start_time integerValue] * 60];
    NSDate *endTimeDate = [midnight dateByAddingTimeInterval:[_slot.end_time integerValue] * 60];

    NSString *startTime = [dateFormatter stringFromDate:startTimeDate];
    NSString *endTime = [dateFormatter stringFromDate:endTimeDate];

    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    [dateFormatter setDateFormat:@"E, MMM dd, yyyy"];
    return [NSString stringWithFormat:@"%@ %@-%@",[dateFormatter stringFromDate:currDate], startTime, endTime];
}

didSelectRowAtIndexPathコードを次のように変更することで、正しく動作させることができます

Slots *selectedSlot = [_fetchedResultsController objectAtIndexPath:indexPath];

Slots *selectedSlot = [Slots disconnectedEntity];
Slots *tmpSlot = [_fetchedResultsController objectAtIndexPath:indexPath];
for (id key in tmpSlot.entity.attributesByName) {
    [selectedSlot setValue:[tmpSlot valueForKey:key] forKey:key];
}

disconnectedEntity は、オブジェクトに関連付けられていない Core Data 管理コンテキストです。

+ (id)disconnectedEntity {
    NSManagedObjectContext *context = [[CoreDataHelper sharedInstance] managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Slots" inManagedObjectContext:context];
    return [[self alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];
}

しかし、なぜ元のコードが機能しないのか疑問に思っています。fetchedResultsControllerが参照を渡しているためだと思いますがselectedSlotsfetchedResultsController更新すると参照が存在しなくなりますか?

4

0 に答える 0