UITableViewController与UITableView

时间:2012-04-17 09:01:34

标签: ios uitableview

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

一个是UITableViewController,我理解的方式是从Superclass中提取Delegate和Datasource。

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

到目前为止很好: - )

现在这是我没有得到的:

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

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

如果我没有设置

,这个和其他5个情况会在UIViewController上出错
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,没有这个选项。

干杯杰夫

---添加图片----

enter image description here

enter image description here


要进入编辑模式,我在viewDidLoad

中有这个代码
self.navigationItem.leftBarButtonItem = self.editButtonItem;

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

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

{     if(editingStyle == UITableViewCellEditingStyleDelete){         NSManagedObjectContext * context = [self.fetchedResultsController managedObjectContext];         [context deleteObject:[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();
    }
}   
}

现在+选项有效,但我只在重新启动应用后看到了结果。我可以滑动和删除,但同样不会在应用的同一个实例中实时生动。

1 个答案:

答案 0 :(得分:1)

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

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

在该方法中,tableView是什么意思?传入的论点,或你的ivar?

回答您的具体问题:

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

  2. 我不确定你在这里问的是什么,你可以把你想要的东西叫到桌面视图,但你也必须改变向tableView发送消息的所有内容。为了保持合作,我会合成这样的财产:

    self.tableView

    这可以防止首先存在名为@synthesize tableView = _tableview; 的ivar。我假设您没有宣布ivar,并且只将该属性声明为IBOutlet?:

    tableView