0

これは私にとって大きな問題であり、私はまだそれに固執しているので、誰かが私に何らかのガイダンスを与えてくれることを願っていました.

私が持っているものは次のとおりです。

  • 複数のセルを含む 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;
    }

各テーブルビューで、メソッド 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 を作成する必要があります...

よろしく

4

1 に答える 1

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 をオーバーライドする方法です。ポップオーバー テーブル ビュー コントローラーの実装で:

- (id)initWithTableTag:(int)tableTag
{
    self = [super init];
    if (self) {
        _currentTable = tableTag;
    }
    return self;
}

(ヘッダーでも宣言するよう- (id)initWithTableTag:(int)tableTag;にしてください。)次に、ポップオーバーコントローラーを作成して提示するとき(これは、 textFieldShouldBeginEditing: delegate 呼び出しで行っていると想定しています):

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

    // ...

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

    // ...
    // display the popover

    return YES;
}

残念ながら、ストーリーボードを使用してこれを行う方法がわかりません。

于 2013-02-17T03:11:59.397 に答える