我的应用只是以特定方式崩溃。这是对正在发生的事情的分解。
我可以在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;
}
答案 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分配给视图?