0

私のアプリは特定の方法でのみクラッシュします。これが何が起こっているかの内訳です。

UITextViewにテキストを入力し、テキストを保存して別のUIViewControllerのUITableViewに行を追加するボタンをタップできます。次に、UITableViewから目的のセルをタップすると、UIViewControllerが閉じられ、テキストがメインUIViewControllerに再び表示されます。

UITextViewをクリアするだけの別のボタンがあるので、新しいテキストを入力できます。

追加した行のテキストを表示し、[追加]ボタンをタップして新しいテキストを入力し、[保存]ボタンをタップすると、アプリがクラッシュします。

コードの一部を次に示します。

didSelectRowコード:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
     //Setting the text stored in an array into a NSString here
    _displayString = [_savedNoteArray objectAtIndex:indexPath.row];

    [self dismissViewControllerAnimated:YES completion:nil];
} 

ボタンコードを保存:

- (IBAction)saveNote
{
    if (_noteView.aTextView.text == nil)
    {
        [_noteArray addObject:@""];

        Note * tempNote = [[Note alloc] init];
        _note = tempNote;

        [_savedNotesViewController.savedNoteArray addObject:tempNote];
        NSIndexPath * tempNotePath = [NSIndexPath indexPathForRow: [_savedNotesViewController.savedNoteArray count]-1 inSection:0];
        NSArray * tempNotePaths = [NSArray arrayWithObject:tempNotePath];
    [_savedNotesViewController.noteTableView insertRowsAtIndexPaths:tempNotePaths withRowAnimation:NO];

       [[NSNotificationCenter defaultCenter] postNotificationName:@"AddNote" object:nil];

    }
    else
    {
        [_noteArray addObject:self.noteView.aTextView.text];

        Note * tempNote = [[Note alloc] init];
       _note = tempNote;

        [_savedNotesViewController.savedNoteArray addObject:tempNote];
        NSIndexPath * tempNotePath = [NSIndexPath indexPathForRow:[_savedNotesViewController.savedNoteArray count]-1 inSection:0];
        NSArray * tempNotePaths = [NSArray arrayWithObject:tempNotePath];

        //**** This is where the app is crashing *****
        [_savedNotesViewController.noteTableView insertRowsAtIndexPaths:tempNotePaths withRowAnimation:NO];

        [[NSNotificationCenter defaultCenter] postNotificationName:@"AddNote" object:nil];

    }

    Note * myNote = [Note sharedNote];
    myNote.noteOutputArray = _noteArray;

}

バットコードを追加します(新しいUITextViewを作成します):

- (IBAction)addButtonTapped
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"AddNote" object:nil];
}

私のviewWillAppearで、選択した行のテキストを表示します。これを行います。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.noteView.aTextView.text = _savedNotesViewController.displayString;
}

ノートコード(シングルトンクラス):

 static Note * sharedNote = nil;

 - (id)initWithNote:(NSString *)newNote
 {
    self = [super init];

    if (nil != self)
    {
        self.note = newNote;
    }

    return self;
}

+ (Note *) sharedNote
{
    @synchronized(self)
    {
        if (sharedNote == nil)
        {
            sharedNote = [[self alloc] init];
        }
    }

    return sharedNote;
}

アプリがクラッシュすると、次のようになります。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Note isEqualToString:]: unrecognized selector sent to instance 0x8875f20'

コードをステップスルーすると、テキストが配列に追加されますが、insertRowsAtIndexPathsのタイミングになると、アプリが起動します。

どんなアドバイスも大歓迎です!

*編集//TableViewコード**

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_savedNoteArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    //I have a feeling this could be where an issue is. 
    NSString * cellString = [_savedNoteArray objectAtIndex:indexPath.row];
    cell.textLabel.text = cellString;

    return cell;
}
4

1 に答える 1

1

潜在的な問題の 1 つ (クラッシュではない可能性がありますが、問題の原因となります) は、Note オブジェクトsavedNoteArrayを文字列として使用しようとしている (以下のコード)に格納していることです。

//Setting the text stored in an array into a NSString here
_displayString = [_savedNoteArray objectAtIndex:indexPath.row];

次に、その displayString を UITextView の text プロパティ (NSString* であるはずです) に割り当てます。

self.noteView.aTextView.text = _savedNotesViewController.displayString;

この問題の短い形式は次のように要約できます...

Note *note = [[NSNote alloc] init];
[array addObject:note];
textView.text = array[0];

これは明らかに問題を引き起こします。基本的に、文字列であるはずのものに「メモ」オブジェクトを割り当てています。

これcellForRowAtIndexPath:は、テーブル ビュー データ ソースのメソッドで発生しているクラッシュにつながる可能性があります。そこでも Note オブジェクトを使用していますか、それとも NSStrings をビューに適切に割り当てていますか?

于 2013-03-05T06:48:52.443 に答える