0

私には2つのエンティティ(および2つのtableViews)があります。最初のエンティティ名はPerson、2番目はEvent、最初のtableViewには人の名前があり、2番目のイベントではPersonとEventの間に1対多の関係があります。ユーザーが名前の1つをタップすると、2番目のtableViewにその人のイベント(タイプ)が表示されるようにしたいと思います。問題は、空のセルを取得することです。

これが私が新しいイベントを追加する方法です:

 - (void) addEventControllerDidSave{


        NSManagedObjectContext* context = [self managedObjectContext];
        Event *newEvent = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:context];
        [newEvent setType:@"dennis"];
        [currentPerson addEventsObject:newEvent];

        NSError *error;
        if (![[self managedObjectContext] save:&error])
        {
            NSLog(@"Problem saving: %@", [error localizedDescription]);
        }

        [self dismissViewControllerAnimated:YES completion:nil];
    }

このメソッドは動的ではないことを知っています。テストのためだけに、常にイベントタイプ「dennis」を取得します。

私の2番目のtableViewメソッド:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[self currentPerson] events] count];
}

最も重要な方法問題はここ(またはsaveメソッド)にあると思います:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"eventsCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (nil == cell)
    {
        NSEnumerator *enumerator = [[[self currentPerson] events] objectEnumerator];
        Event *event = [[enumerator nextObject]objectAtIndexPath:indexPath];
        [[cell textLabel]setText:[event type]];
    }

    return cell;
}

更新: ophychiusが言ったように、defineセルラインをifから移動し、次のように変更します。

//create cell use relation
    NSArray *eventsArray = [[[[self currentPerson] events] objectEnumerator]allObjects];
    Event *newEvent = [eventsArray objectAtIndex:indexPath.row];
    [[cell textLabel]setText: [newEvent type]];
4

1 に答える 1

1

線を動かしてみてください

    NSEnumerator *enumerator = [[[self currentPerson] events] objectEnumerator];
    Event *event = [[enumerator nextObject]objectAtIndexPath:indexPath];
    [[cell textLabel]setText:[event type]];

ifブロックの外側。ifの中には、まだセルがない場合にセルを作成するコードが必要です(ifブロックの直前で取得しようとします)。

現在、セルを作成していない可能性があります。作成している場合は、セルを作成するとifブロックがスキップされるため、テキストを作成していません。

次に例を示します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSEnumerator *enumerator = [[[self currentPerson] events] objectEnumerator];
    Event *event = [[enumerator nextObject]objectAtIndexPath:indexPath];
    [[cell textLabel]setText:[event type]];

    return cell;
}
于 2012-12-11T14:56:02.440 に答える