1

当我尝试这些不同的设置时,我在一个应用程序中有 2 个控制器。

一个是 UITableViewController,我理解的方式是委托和数据源是从超类中提取的。

现在按照这个理论,我现在还有一个 UIViewController,上面有一个 UITableView,在头文件中我已经声明了 Datasource 和 Delegate。

到目前为止,一切都很好:-)

现在这是我不明白的一点:

在实现文件中,我可以使用 tableView 指针链接数据,但我使用的是 Core Data,并且我有这段代码:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
  {   
  [self.tableView beginUpdates];
  }

如果我没有设置

IBOutlet UITableView *tableView;

当然是合成的:-)

但是,如果我声明这个 tableView,我会收到一条警告,要求在一行上加倍:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
[self configureCell:cell atIndexPath:indexPath];
return cell;
}

因为它还声明了一个tableView。

所以我有两个问题:

1) 如果我设置了 UITableViewDatasource 和 Delegate,为什么还要设置 IBOutlet?

2)如果我给 UITableViewCell 一个不同的指针名称 - 比如 tableView2,为什么我在编辑数据时看不到更改,而只能在重新启动应用程序后看到结果?

MasterViewController,也就是 UITableViewController 没有这个选项。

干杯杰夫

---添加图像----

在此处输入图像描述

在此处输入图像描述


要进入编辑模式,我在 viewDidLoad 中有这段代码

self.navigationItem.leftBarButtonItem = self.editButtonItem;

我使用此代码来执行需要完成的操作:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{ if (editingStyle == UITableViewCellEditingStyleDelete) { NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; [上下文删除对象:[self.fetchedResultsController objectAtIndexPath:indexPath]];

    NSError *error = nil;
    if (![context save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}   
}

现在 + 选项有效,但我仅在重新启动应用程序后才能看到结果。我可以滑动和删除,但它不会在应用程序的同一个实例中实时动画。

4

1 回答 1

1

您已经声明了一个名为 tableView 的属性,并且可能只是用相同的名称合成了它。

UITableViewController还有一个名为 tableView 的属性,但支持 ivar 可能会被称为不同的东西,可能_tableView正是因为默认的 tableview 数据源和委托方法通常传入一个名为的参数tableView,在方法的范围内,它与您的实例变量发生冲突。

在那个方法里面,是什么tableView意思?传入的参数,还是你的 ivar?

在回答您的具体问题时:

  1. 当您的视图控制器需要与表视图通信时(例如当您告诉它开始更新时),您需要这些实例的插座。当表格视图需要与您的视图控制器通信时(例如当它要求一个单元格时),数据源和委托连接就在那里。

  2. 我不确定你在这里问什么,你可以调用任何你喜欢的表视图的出口,但你还必须更改发送消息的所有内容self.tableView。为了一致性,我会像这样合成属性:

    @synthesize tableView = _tableview;
    

    这首先防止了一个名为tableView存在的 ivar。我假设您尚未声明 ivar,并且仅将属性声明为 IBOutlet?:

    @property (nonatomic) IBOutlet UITableView *tableView;
    
于 2012-04-17T09:16:26.210 回答