为什么我的应用程序在表视图插入行期间崩溃?

时间:2013-03-05 05:37:16

标签: objective-c uitableview uiviewcontroller nsstring uitextview

我的应用只是以特定方式崩溃。这是对正在发生的事情的分解。

我可以在UITextView中输入文本,然后点击一个保存文本的按钮,并在另一个UIViewController的UITableView中添加一行。然后,我可以从UITableView点击所需的单元格,UIViewController将关闭,文本将再次出现在主UIViewController上。

我有另一个按钮,只是清除UITextView,所以我可以输入新的文本。

如果我从添加的行中查看文本,然后点击“添加”按钮输入新文本,然后点击“保存”按钮,我的应用程序崩溃。

以下是一些代码:

didSelectRow Code:

- (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;
}

1 个答案:

答案 0 :(得分:1)

一个潜在的问题(可能不是你的崩溃,但会导致问题)是你在savedNoteArray中存储Note对象但是你试图将它们用作字符串(下面的代码):< / p>

//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];

这显然会引发问题。您基本上是将“Note”对象分配给应该是字符串的东西。

这可能会导致您在表视图数据源的cellForRowAtIndexPath:方法中遇到的崩溃。您是否也在那里使用Note对象,或者您是否正确地将NSStrings分配给视图?