现在我正在使用coredata和收集。我在coredta中有一个名为“Employee”的实体,它有多个属性(emp_id,name,address,dept)。我完成了保存数据并成功获取数据。问题是我正在使用集合视图,我正在使用集合视图的委托方法(“cellForItemAtIndexPath”),在此我正在传递来自coredata的'Employee'entity数据。我正在使用员工姓名设置按钮的标题(按钮的数量等于coredata中的行数)。
现在问题从这里开始我想在我点击特定按钮时执行按钮点击操作我想要导航到另一个控制器并希望显示有关该员工的所有信息。我不知道如何要做到这一点我在下面粘贴我的代码。您的回复大多是受欢迎的:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
info = [array objectAtIndex:indexPath.row];
static NSString *cellIdentifier = @"empCell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
titlebutton = (UIButton *)[cell viewWithTag:100];
[titlebutton addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
[titlebutton setTitle:info.name forState:UIControlStateNormal];
return cell;
}
此处info是Employee实体的实例。按钮显示正常,其标题为coredata中员工的姓名。在这种情况下,我想在按钮点击时将每个员工的id(例如对于button1,它是“1”.. button2,它是“2”)传递给另一个控制器。问题是我得到的id仅用于最后一个按钮,因为在运行时,前一个emp id被最后一个替换。在这里,我正在处理该特定问题,即如何在按钮点击时将每个emp id传递给下一个控制器。
答案 0 :(得分:0)
检索Core Data填充集合视图的单元格对象的正确方法如下。在任何情况下,您都应该使用NSFetchedResultsController
来提高效率。在适当的位置插入(不推荐)数组函数。
不需要标签。在Interface Builder中,只需将按钮操作直接链接到包含集合视图的视图控制器。 (您也可以在代码中进行连接,方法是在cellForItem...
中设置目标和选择器,如上所述。)
-(IBAction)didPressCellButton:(UIButton*)sender {
CGPoint point = [sender convertPoint:CGPointZero toView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:point];
Entity *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
// or: Entity *object = array[indexPath.row];
// do something with object
}
最好这样做,因为我们不对单元格的视图层次结构做出任何假设。它也是一种检索对单元格,索引路径或获取结果控制器对象的正确引用的安全方法。
下一步是将对象传递给下一个视图控制器。标准方式是故事板segues。您可以使用
在上面的按钮处理程序中手动调用segue[self performSegueWithIdentifier:@"showDetail"];
但在这种情况下,您甚至不需要按钮操作。如果您将按钮直接与Interface Builder中的segue连接到详细视图控制器,则可以在prepareForSegue:
中使用完全相同的代码。确保您的segue有一个标识符字符串(例如“showDetail”)。确保目标视图控制器具有与所需实体类型相同的属性。在这里,您可以传递您喜欢的任何其他数据。
-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showDetail"]) {
UIButton *button = (UIButton*)sender;
CGPoint point = [button convertPoint:CGPointZero toView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:point];
Entity *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
MyDetailViewController *controller = segue.destinationController;
controller.entityProperty = object;
}
}