核心数据-为不同的表视图设置谓词



这个问题对我来说一直是个大问题,我仍然坚持下去,所以我想有人能给我一些指导。

我拥有的是:

  • 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;
}

不幸的是,我不知道如何使用故事板来做到这一点。

最新更新