0

これは私のSearchViewControllerのコードです。しかし、nextControllerにプッシュすると、アプリがクラッシュしてnextControllerに到達しないか、場合によっては、クラッシュする前にアプリを一瞥します。ログに「不良インスタンスがセレクターに送信されました」というエラーが表示されます。SearchViewControllerにはストーリーボードに接続されたNavigationControllerがあり、ご覧のとおり、ナビゲーションコントローラーをプッシュします。

'pushViewController'を'presentModalViewController'に変更すると、UITableViewControllerをロードできるようになりましたが、結果が表示されている場合にTableViewをスクロール(スワイプ)するとクラッシュするようになりました。空の場合(一致する結果がない場合)、クラッシュしていません。変。また、TableViewの上にナビゲーションバーはありません。

私が間違っていることを教えて、それを修正するのを手伝ってくれませんか?簡単な問題だと感じました。

SearchViewController.h

#import <UIKit/UIKit.h>

@interface SearchViewController : UIViewController

@property (nonatomic, strong) NSMutableArray *allObjectsArray;
@property (nonatomic, strong) NSMutableArray *resultObjectsArray;

@property (nonatomic, strong) IBOutlet UITextField *nameTextField;


-(IBAction)searchButtonPressed:(id)sender;

@end

SearchViewController.m

-(IBAction)searchButtonPressed:(id)sender{  


    NSString *path = [[NSBundle mainBundle] pathForResource:@"Wine" ofType:@"plist"];
    allObjectsArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

    NSString *nameString = [NSString stringWithFormat:@"%@", [nameTextField text]];

    resultObjectsArray = [NSMutableArray array];
    for(NSDictionary *wine in allObjectsArray)
    {
        NSString *wineName = [wine objectForKey:@"Name"];
        NSRange range = [wineName rangeOfString:nameString options:NSCaseInsensitiveSearch];
        if(range.location != NSNotFound)
        [resultObjectsArray addObject:wine];
    }

NSLog(@"Objects: %@", allObjectsArray);

ResultsTableViewController *nextController = [[self storyboard] instantiateViewControllerWithIdentifier:@"ResultsController"];

nextController.objectsArray = [[NSMutableArray alloc]initWithArray:resultObjectsArray];

NSLog(@"Results: %@", nextController.objectsArray);
[self.navigationController pushViewController:nextController animated:YES];
[nextController release];
}

これは、UITableViewにデータを入力するnextControllerのobjectsArrayです。

@property (nonatomic, strong) NSMutableArray *objectsArray;

ResultsTableViewController.m:

#import "ResultsTableViewController.h"

@interface ResultsTableViewController ()

@end

@implementation ResultsTableViewController

@synthesize objectsArray;

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

- (void)viewDidLoad
{
    [super viewDidLoad];
 NSLog(@"%s", __FUNCTION__);

// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;

// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [objectsArray count];
NSLog(@"%s", __FUNCTION__);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%s", __FUNCTION__);
static NSString *CellIdentifier = @"searchResultCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    // Use the default cell style.
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"searchResultCell"] autorelease];
}


// Configure the cell...
cell.textLabel.text = [[objectsArray objectAtIndex:indexPath.row] valueForKey:@"Name"];

return cell;
}

@end
4

1 に答える 1

1

(回答として投稿 - 質問のコメントで詳細を参照)

ARC を使用していますか、または使用していませんか? なぜなら、[UIViewController release] がいくつかあるからです...

(self.objectsArray について)

cell.textLabel.text = [[self.objectsArray objectAtIndex:indexPath.row] valueForKey:@"Name"];
  • そして他の機会に。次に、プロパティゲッターを使用することを保証します...値の設定と同じです。self.objectsArray = ...;ただし、プロパティにアクセスしているときのみ。提供されている場合は、適切に取得しています@synthesize-d

(そしてもう1つ、ちょっとしたことです)

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
  • スコープで既に定義されている場合は、定数を可能な限り識別子として使用してください

ところで、「他のコードが機能するように ARC を非アクティブ化したところです」と書いたことに気付きました...その必要はありません。ファイルごとに ARC を無効にすることができます。また、メモリ管理と obj-c の経験がない場合は、ARC を無効にしないでください。これは iPhone Obj-C への素晴らしい追加です...クラスごとに ARC を無効にする方法に関する私の投稿を参照してください: UIActivityIndi​​cator を UITableView に追加する

于 2012-08-01T00:25:24.763 に答える