这个问题对我来说一直是个大问题,我仍然坚持下去,所以我想有人能给我一些指导。
我拥有的是:
- 3个表视图,包含多个单元格,每个单元格包含多个文本字段
- 每当按下这些单元格上的特定文本字段时,就会在弹出窗口中显示1个表视图。这个表视图拥有所有!!从我的数据库中检索必要数据的核心数据方法
一切正常……但我需要区分表视图1、2或3中应该出现什么类型的数据……所以我知道我必须使用谓词!。
我所做的:(我还尝试过其他事情)
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController == nil)
{
NSFetchRequest *fetchRequestList = [[NSFetchRequest alloc] init];
NSEntityDescription *entityList = [NSEntityDescription entityForName:@"List" inManagedObjectContext:self.managedObjectContext];
[fetchRequestLista setEntity:entityList];
TableViewOne *table1 = [[Cobertura alloc]init];
TableViewTwo *table2 = [[Cobertura alloc]init];
if (table1 textFieldShouldBeginEditing:table1.textFieldPressed)
{
fetchRequestList.predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"reference", arrayTableview1];
}
if (table2 textFieldShouldBeginEditing:table2.textFieldPressed)
{
fetchRequestList.predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"reference", arrayTableview2];
}
NSSortDescriptor *cellTitle = [[NSSortDescriptor alloc] initWithKey:@"reference" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:cellTitle, nil];
[fetchRequestLista setSortDescriptors:sortDescriptors];
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequestLista managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"referencia" cacheName:nil];
_fetchedResultsController.delegate = self;
self.fetchedResultsController = _fetchedResultsController;
return _fetchedResultsController;
}
在我的每个表视图中,我的方法textFieldShouldBeginEdition:中都有一个"popoverTableview"的实例
popoverTableview = [self.storyboard instantiateViewControllerWithIdentifier:@"popoverTableview"];
popover = [[UIPopoverController alloc] initWithContentViewController:popoverTableview];
[popover presentPopoverFromRect:textField.bounds inView:textField permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
popoverTableview.delegate = self;
popoverTableview.popView = self.popover;
因此,如果我在tableview1中,我需要获得[NSPredicate predictateWithFormat:@"%K in%@",@"reference",arrayTableview1];
我应该创建某种我的tableviewS可以访问的方法吗?我在这里忘记了什么或者没有注意到什么?
提前感谢,欢迎任何建议!问候
对于所有遇到与我相同问题的人,以下是我所做的解决方法:
这是在我创建popoverview时,按下特定的文本字段:
popoverTableview = [self.storyboard instantiateViewControllerWithIdentifier:@"popoverTableview"]initWithTextFieldTag:myTextFieldThatWasPressed.tag]
popover = [[UIPopoverController alloc] initWithContentViewController:popoverTableview];
[popover presentPopoverFromRect:textField.bounds inView:textField permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
popoverTableview.delegate = self;
popoverTableview.popView = self.popover;
popoverTableview.aIntVariable = myTextFieldThatWasPressed;
然后在我的popovertable视图中:
- (id)initWithTextFieldTag:(int)textFieldTag
{
self.aIntVariable = textFieldTag;
return self;
}
然后在fetchedResultsController方法中,您只需要创建一个简单的if'stelling您想要的wich谓词。。。
问候
如果提取的结果控制器用于popover表,并且您需要知道在哪个表中选择了文本字段,我建议在创建每个文本字段并创建int _currentTable
实例变量时标记它们。这样,当调用textFieldShouldBeginEditing:
方法时,可以使用标记设置ivar的值,并在为popover表创建提取的结果控制器时检查该标记。
所以,不是
if (table1 textFieldShouldBeginEditing:table1.textFieldPressed)
{
fetchRequestList.predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"reference", arrayTableview1];
}
if (table2 textFieldShouldBeginEditing:table2.textFieldPressed)
{
fetchRequestList.predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"reference", arrayTableview2];
}
你会有
if (_currentTable == 1) {
fetchRequestList.predicate = // table one predicate
} else if (_currentTable == 2) {
fetchRequestList.predicate = // table two predicate
}
更新:
这就是我从代码中重写init的方式。在您的popover表视图控制器实现中:
- (id)initWithTableTag:(int)tableTag
{
self = [super init];
if (self) {
_currentTable = tableTag;
}
return self;
}
(确保您也在头中声明了- (id)initWithTableTag:(int)tableTag;
。)然后,当您创建并呈现popover控制器时(我假设您在textFieldShouldBeginEdition:delegate调用中这样做):
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
// ...
YourPopoverTableViewControllerClass *vc = [[YourPopoverTableViewControllerClass alloc] initWithTableTag:textField.tag];
// ...
// display the popover
return YES;
}
不幸的是,我不知道如何使用故事板来做到这一点。