我在一个应用程序中有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,没有这个选项。
干杯杰夫
---添加图片----
要进入编辑模式,我在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();
}
}
}
现在+选项有效,但我只在重新启动应用后看到了结果。我可以滑动和删除,但同样不会在应用的同一个实例中实时生动。
答案 0 :(得分:1)
您已经声明了一个名为tableView的属性,并且可能只是使用相同的名称合成它。
UITableViewController
也有一个名为tableView的属性,但支持ivar将被称为不同的东西,可能是_tableView
,正是因为默认的tableview数据源和委托方法通常传入一个名为{{1的参数在方法范围内,它与您的实例变量发生冲突。
在该方法中,tableView
是什么意思?传入的论点,或你的ivar?
回答您的具体问题:
当您的视图控制器需要与表视图对话时(例如,当您告诉它开始更新时),您需要这些实例的插座。当表视图需要与视图控制器通信时(例如,当它要求一个单元格时),数据源和委托连接就在那里。
我不确定你在这里问的是什么,你可以把你想要的东西叫到桌面视图,但你也必须改变向tableView
发送消息的所有内容。为了保持合作,我会合成这样的财产:
self.tableView
这可以防止首先存在名为@synthesize tableView = _tableview;
的ivar。我假设您没有宣布ivar,并且只将该属性声明为IBOutlet?:
tableView