为不同的表视图设置谓词

Posted

技术标签:

【中文标题】为不同的表视图设置谓词【英文标题】:Setting a predicate for different tableviews 【发布时间】:2013-02-16 01:57:08 【问题描述】:

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

我拥有的是:

3 个表格视图,包含多个单元格,每个单元格包含多个文本字段。 每次按下这些单元格上的特定文本字段时,都会在弹出框内显示 1 个表格视图。这个表视图有所有!从我的数据库中检索必要数据的核心数据方法。

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

在我的每个表格视图中,我的方法 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 可以访问的方法吗?我在这里忘记了什么或没有注意什么?

提前致谢,欢迎提出任何建议! 问候

对于遇到与我相同的问题的每个人,以下是我为解决而采取的措施:

这是我在按下特定文本字段时创建弹出视图:

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】:

如果获取的结果控制器用于弹出表并且您需要知道在哪个表中选择了文本字段,我建议您在创建每个文本字段时标记它们并创建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

更新:

这就是我从代码中覆盖初始化的方式。在您的弹出表视图控制器实现中:

- (id)initWithTableTag:(int)tableTag

    self = [super init];
    if (self) 
        _currentTable = tableTag;
    
    return self;

(确保您还在标题中声明 - (id)initWithTableTag:(int)tableTag;。)然后,当您创建并呈现弹出框控制器时(我假设您正在 textFieldShouldBeginEditing: 委托调用中执行此操作):

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 

    // ...

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

    // ...
    // display the popover

    return YES;

很遗憾,我不知道如何使用情节提要来做到这一点。

【讨论】:

您好 enjayem,感谢您回复我的帖子,这个问题让我失去了很多天,我仍然不知道它是什么问题。你的第二个建议是我的那个米追求。在每个 tableview(1,2,3) 中,我有一个文本字段变量 (textfieldPressed),当我实例化 popoverTableview 时(正如我之前向你展示的那样),我输入了这个:[popoverTableview.tableView setTag:textFieldPressed.tag];现在在我的 NSFetchedResultsController 中(在我的 popoverTableview 中)做你所说的关于 _current 表的事情,检查它的标签对吗?但是他提取所有结果,不尊重 if 的..what?!?!?. 我想 FRC 是在设置标签之前加载的。如果是这样,您可以做两件不同的事情:(1)在创建弹出框时重写 init 方法以传递标签(这将是我的首选方法,但我对故事板没有任何经验,所以我不太了解知道如何做而不是通过代码。)或(2)覆盖自定义弹出视图控制器中的 setTag: 方法,告诉它清除当前的 FRC 并加载一个新的。 popoverTableview = [self.storyboard instantiateViewControllerWithIdentifier:@"popoverTableview"]; popover = [[UIPopoverController alloc] initWithContentViewController:popoverTableview]; popoverTableview.tableview.tag=textFieldPressed;令我困惑的是,这是我在我的一个 tableviews 中创建 popovertableview 的时刻,并且我放置了一个 NSlog 并且 popovertableview.tableview.tag 与 textfieldpressed 具有相同的标签。我怎样才能覆盖init方法?我也是这方面的新手.. 是的,看起来您是在加载 FRC 和表格后设置标签。我已经更新了我的答案,向您展示如何从代码中覆盖 init。 非常感谢您帮助我 enjayem...我将根据您的建议工作,稍后我会在这里发表评论。问候

以上是关于为不同的表视图设置谓词的主要内容,如果未能解决你的问题,请参考以下文章

Django 字段查询谓词表

为不同的表视图设置谓词

为不同的表视图创建可重用的页脚视图(Swift 5)

将动态单元格的表视图内容高度设置为表视图高度约束 ios

检索在 sqlite 数据库中插入的所有行,并在包含标签的表视图单元格中显示为具有不同部分的子视图

表视图控制器问题