除非单元格触摸,否则文本不会显示在表格视图

时间:2014-05-17 14:30:17

标签: ios objective-c

我在iPhone应用程序中以传统的Master / Detail方式设置了表格视图。当我在详细信息屏幕上单击“保存”(添加我想要的信息后)后,它会切换回主列表,但是,主列表中单元格中出现的文本不会出现直到我用手指触摸细胞,然而,如果我用手指触摸细胞,它显然会切换到细节屏幕,然后我必须点击"返回"进入主列表,其中单元格现在具有它应该具有的文本。有趣的是,表格视图图像在保存后立即显示 - 我不必触摸单元格以使图像以我必须使文本显示的方式显示。

点击"保存"详细信息屏幕中的按钮运行此代码。 mnemonicField.text保存到currentTopic,之后我将其设置为单元格中显示的文本

- (IBAction)save:(id)sender {
    [self.currentTopic setTopic:topicField.text];
    [self.currentTopic setMnemonic:mnemonicField.text]; //this should appear in cell on master
    [self.currentTopic setMood: self.mood]; 
    [self.delegate AddTopicViewControllerDidSave];
}

主表视图控制器是上述方法中引用的委托。这是方法。

-(void)AddTopicViewControllerDidSave{
    NSError *error = nil;
    NSLog(@"saving topick");
    NSManagedObjectContext *context = self.managedObjectContext;
    if (![context save:&error]){
        NSLog(@"Error: %@", error);
    }
    [self.navigationController popToRootViewControllerAnimated:YES];

}

cellForRowAtIndexPath中,我调用另一种方法来设置单元格

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

    static NSString *CellIdentifier = @"TopicCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath:indexPath];

     [self configureCell:cell atIndexPath:indexPath];//sets up cell, see below

    return cell;

}

这里设置了单元格configureCell:atIndexPath。同样,请注意图像和textLabel.text都是在此方法中设置的,但我必须用手指触​​摸单元格以实际显示文本

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    // Configure the cell...
    Topic *topic = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = topic.mnemonic;
    NSLog(@"jokemood  in configure cell %@", joke.mood);
    UIImage *funnyimage = [UIImage imageNamed: @"nslaugh.png"];
    UIImage *badimage = [UIImage imageNamed: @"nsbad.png"];
    UIImage *crapimage = [UIImage imageNamed: @"nscrap.png"];
    UIImage *mehimage = [UIImage imageNamed: @"nsmeh.png"];
    UIImage *smileimage = [UIImage imageNamed: @"nssmile.png"];

    switch ([topic.mood intValue]) {
        case 0:
            // do something
            NSLog(@" topic table 0");

            cell.imageView.image = crapimage  ;
            break;
        case 1:

经过一些实验,我确定问题是上述函数中的这一行cell.textLabel.text = topic.mnemonic;。如果我取出该行,则在保存在详细信息屏幕后,标题会立即显示在主列表的单元格中。但是,如果我将该行删除,那么当我启动应用程序时,当数据从核心数据中提取时,标题不会被分配。所以,无论哪种方式都存在问题。如果在上面的函数中保留了这一行cell.textLabel.text = topic.mnemonic;,那么我必须触摸主列表中的单元格(在保存详细信息之后)才能显示文本,但是如果我取出该行,那么就是textLabel。当应用程序从核心数据中提取时,不会分配文本。这两种选择都不可接受。

你知道为什么会这样吗?

为了在主视图控制器中完成此处的prepareForSegue,我在目标视图控制器上根据主视图控制器中的主题设置currentTopic

 if ([[segue identifier] isEqualToString:@"AddJoke"]){

        MMAddTopicViewController *ajvc = (MMAddTopicViewController *)[segue destinationViewController];
        ajvc.delegate = self;
        ajvc.mood = nil;

        Topic *newTopic = (Topic *)[NSEntityDescription insertNewObjectForEntityForName:@"Topic" inManagedObjectContext: [self managedObjectContext]];
        NSMutableSet* relationship = [self.rootObject mutableSetValueForKey:@"subItems"];

        NSManagedObject *lastObject = [self.fetchedResultsController.fetchedObjects lastObject];
        double lastObjectDisplayOrder = [[lastObject valueForKey:@"displayOrder"] doubleValue];


        [newTopic setValue:[NSNumber numberWithDouble:lastObjectDisplayOrder + 1.0] forKey:@"displayOrder"];
         [relationship addObject:newJoke];
        ajvc.currentTopic = newTopic;  ///currentTopic in destination view controller is set to topic from master view controller

1 个答案:

答案 0 :(得分:0)

我在主视图控制器的save方法中添加了[self.tableView reloadData];,它从详细控制器调用(master用作详细信息的委托)。 Lynda.com教程我从didn复制它不得不使用self.tableView reloadData,不知道为什么我的代码会这样做。

-(void)AddTopicViewControllerDidSave{
    NSError *error = nil;
    NSLog(@"saving cock");
    NSManagedObjectContext *context = self.managedObjectContext;
    if (![context save:&error]){
        NSLog(@"Error: %@", error);
    }
    [self.navigationController popToRootViewControllerAnimated:YES];
    [self.tableView reloadData];


}