为不同的表视图设置谓词

时间:2013-02-16 01:57:08

标签: core-data delegates nspredicate nsfetchedresultscontroller nsfetchrequest

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

我拥有的是:

  • 包含多个单元格的3个表视图,每个单元格包含多个文本字段。
  • 每次按下这些单元格上的特定文本字段时,弹出窗口内出现的1个tableview。这个桌面视图全部!!从我的数据库中检索必要数据的核心数据方法。

一切正常......但是我需要区分tableview 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;
    }

在我的每个tableviews中,我的方法textFieldShouldBeginEditing中有一个“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 predicateWithFormat:@“%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;

然后在我的popovertableview中:

- (id)initWithTextFieldTag:(int)textFieldTag
{
self.aIntVariable = textFieldTag;

return self;
}

然后在fetchedResultsController方法中,你只需创建简单的if告诉你想要的谓词......

此致

1 个答案:

答案 0 :(得分:1)

如果获取的结果控制器用于弹出窗口,并且您需要知道在哪个表中选择了文本字段,我建议您在创建文本字段并创建int _currentTable实例时标记每个文本字段变量。这样,当您调用textFieldShouldBeginEditing:方法时,可以使用标记设置ivar的值,并在为弹出窗口创建获取结果控制器时检查该标记。

所以,而不是

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控制器时(我假设你在textFieldShouldBeginEditing:委托调用中):

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    // ...

    YourPopoverTableViewControllerClass *vc = [[YourPopoverTableViewControllerClass alloc] initWithTableTag:textField.tag];

    // ...
    // display the popover

    return YES;
}

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