0

因此,我正在尝试制作一个在表格视图中显示人名的应用程序,然后点击移动到下一个显示该人图像的视图控制器。但是,当我在表格视图上添加搜索栏时;我似乎不正确。

我在这里做错了什么?代码在模拟器上编译并显示,但是当我点击任何按钮时,它给了我最讨厌的错误(线程 1:信号 SIGABRT)

这是我的表视图控制器代码

#import "PhotoTableViewController.h"
#import "Photo.h"
#import "DisplayViewController.h"

@interface PhotoTableViewController ()

@end

@implementation PhotoTableViewController
@synthesize photoSearchBar, showPhotos, filteredPhotos;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    showPhotos = [NSArray arrayWithObjects:
                           [Photo photoofname:@"Main" filename:@"photo1.jpg" notes:@"Amazing Road Bike"],
                           [Photo photoofname:@"Back" filename:@"photo3.jpg" notes:@"this is the back"], nil];
    [self.tableView reloadData];

    self.filteredPhotos = [NSMutableArray arrayWithCapacity:[showPhotos count]];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [filteredPhotos count];
    } else {
        return [showPhotos count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"PCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    Photo *photo = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        photo = [filteredPhotos objectAtIndex:indexPath.row];

    }else
    {
        photo = [showPhotos objectAtIndex:indexPath.row];
    }

    cell.textLabel.text = photo.name;
    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    return cell;
}

#pragma mark Content Filtering

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
    // Update the filtered array based on the search text and scope.
    // Remove all objects from the filtered search array
    [self.filteredPhotos removeAllObjects];
    // Filter the array using NSPredicate
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",searchText];
    filteredPhotos = [NSMutableArray arrayWithArray:[showPhotos filteredArrayUsingPredicate:predicate]];
}

#pragma mark - UISearchDisplayController Delegate Methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    // Tells the table data source to reload when text changes
    [self filterContentForSearchText:searchString scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    // Tells the table data source to reload when scope bar selection changes
    [self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

#pragma mark - TableView Delegate
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Perform segue to candy detail
    [self performSegueWithIdentifier:@"candyDetail" sender:tableView];
}

#pragma mark - Segue
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"photoDetail"]) {
        UIViewController *candyDetailViewController = [segue destinationViewController];
        // In order to manipulate the destination view controller, another check on which table (search or normal) is displayed is needed
        if(sender == self.searchDisplayController.searchResultsTableView) {
            NSIndexPath *indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
            NSString *destinationTitle = [[filteredPhotos objectAtIndex:[indexPath row]] name];
            [candyDetailViewController setTitle:destinationTitle];
        }
        else {
            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
            NSString *destinationTitle = [[showPhotos objectAtIndex:[indexPath row]] name];
            [candyDetailViewController setTitle:destinationTitle];
        }

    }
}

这也是我的名为 Photo 的 Objective C 类的代码

#import "Photo.h"

@implementation Photo

@synthesize name,filename,notes;

+(id) photoofname: (NSString*)name filename:(NSString*)filename notes:(NSString*)notes{
    Photo *newPhoto = [[Photo alloc]init];
    newPhoto.name = name;
    newPhoto.filename = filename;
    newPhoto.notes = notes;
    return newPhoto;
}

@end
4

1 回答 1

1

好吧,只需查看我可以建议您的代码,首先删除对 UITableView 的委托方法 didSelectForRowAtIndexPath 中调用的 prepareForSegue 方法的调用。您正在覆盖 prepareForSegue,因此在您的故事板中,您应该有一个原型单元格,您必须从该单元格中按住 ctrl-drag 到目标控制器并相应地对其进行 segue。这是一个基本概念。还是有问题?让我们在崩溃时查看您的控制台消息。

于 2013-08-05T09:53:26.580 回答