0

私は単一の動作するアプリを持っていましたUITableViewController; [追加] ボタンを押すModalViewControllerと、 が表示され、ユーザーはテキスト フィールドにテキストを追加し、[保存] を押してから、セルNSFetchedResultsControllerを正常に更新できます。UITableView

また、TableView に検索ボタンがあり、モーダルに検索タブを備えた検索コントローラーを呼び出します。入力して [検索] を押すと、そのテーブル内のレコードが検索されます。戻るキャンセルボタンがありました。

UI を変更して、検索が TableView の下部にあるタブ バーの一部になり、ボタンを削除したいと考えています。

私のTableViewにはprepareForSegueメソッドがありました:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    if ([segue.identifier isEqualToString:@"Search"])
    {
        SearchViewController *searchEntry = (SearchViewController *)segue.destinationViewController;
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
        searchEntry.managedObjectContext = managedObjectContext; 
        //[self.navigationController presentModalViewController:searchEntry animated:YES];
    }
}

だから私は基本的にmanagedObjectContext渡っていました。

私はタブを使用しているので、prepareForSegue同等のものはないと思いますか? だから私の質問は、どのようにmanagedObjectContext横断しますか?

SearchViewControllerはこのように見えます:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.searchBar.delegate = self;
    self.tView.delegate = self;
    self.tView.dataSource = self;

    noResultsLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 90, 200, 30)];
    [self.view addSubview:noResultsLabel];
    noResultsLabel.text = @"No Results";
    [noResultsLabel setHidden:YES];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.searchBar becomeFirstResponder];
}

// Once the user taps "search" on the keyboard, you run a fetch and show the results on the table view, or display the No Results label.
// This is one of the SearchBar Delegate methods
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error])
    {
        NSLog(@"Error in search %@, %@", error, [error userInfo]);
    } else
    {
        [self.tView reloadData];
        [self.searchBar resignFirstResponder];
        [noResultsLabel setHidden:_fetchedResultsController.fetchedObjects.count > 0];
    }
}

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id sectionInfo= [[_fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    Transaction *info = [_fetchedResultsController objectAtIndexPath:indexPath];
    [cell.textLabel setText:[NSString stringWithFormat:@"%@", [info valueForKeyPath:@"whoBy.name"]]];
    [cell.detailTextLabel setText:[NSString stringWithFormat:@"%@", [info valueForKeyPath:@"occasion.title"]]];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (NSFetchedResultsController *)fetchedResultsController
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY whoBy.name CONTAINS[c] %@", self.searchBar.text];
    [fetchRequest setPredicate:pred];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;

}

これを実行すると、何も検索されません。クラスの先頭に次のコードを配置すると、その下にエラーが表示されます。

- (NSManagedObjectContext *)managedObjectContext
{
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}

:

<NSInvalidArgumentException> +entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Transaction'

だから私は基本的に同じ機能を作成していますが、TableViewタブバーからタブにmanagedObjectContextを「渡し」、SearchBarViewController以前のように検索を行いたいと考えています。

その他の関連情報; この検索ファイルにはNSManagedObjectContextandのプロパティがあります。NSFetchedResultsController

どんな助けでも大歓迎です。

ありがとう、

4

0 に答える 0