2012-07-22 69 views
0

我的应用程序运行良好,我没有修改它有一个专用的数据控制器类,而不是像在初始测试期间那样在主UI类中处理数据。但是,自从更改后,向tableview添加新项目时它会一直崩溃。TableView崩溃insertRowsAtIndexPath

它崩溃的代码行和错误是;

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

2012-07-22 07:17:44.772 speecher [1897:707] *终止应用程序由于 未捕获的异常 'NSInternalInconsistencyException',原因: “试图插入行0到节0,但更新”

该类的完整代码,(主MasterViewController类)如下之后有在 部分0只有0行。

// 
// SpeecherMasterViewController.m 
// speecher 
// 
// 

#import "SpeecherMasterViewController.h" 
#import "SpeecherDataController.h" 
#import "SpeecherDetailViewController.h" 

@interface SpeecherMasterViewController() { 

    NSString *newTitle; 
    NSMutableArray *_speeches; 
    NSMutableArray *_content; 
    SpeecherDataController *object; 

} 
@end 

@implementation SpeecherMasterViewController 

@synthesize detailViewController = _detailViewController; 

- (void)awakeFromNib 
{ 
    self.clearsSelectionOnViewWillAppear = NO; 
    self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); 
    [super awakeFromNib]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    self.navigationItem.leftBarButtonItem = self.editButtonItem; 

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)]; 
    self.navigationItem.rightBarButtonItem = addButton; 
    self.detailViewController = (SpeecherDetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController]; 
    object = [[SpeecherDataController alloc] init]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

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


#pragma mark - Table View 

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    cell.textLabel.text = [object returnTitle:indexPath.row]; 
    return cell; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Return NO if you do not want the specified item to be editable. 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     [_speeches removeObjectAtIndex:indexPath.row]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. 
    } 
} 

/* 
// Override to support rearranging the table view. 
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 
{ 
} 
*/ 

/* 
// Override to support conditional rearranging of the table view. 
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Return NO if you do not want the item to be re-orderable. 
    return YES; 
} 
*/ 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


    NSString *titleobj = [object returnTitle:indexPath.row]; 
    NSString *contentobj = [object returnContent:indexPath.row]; 
    self.detailViewController.detailItem = titleobj; 
    self.detailViewController.detaitContent = contentobj; 
} 



- (void)insertNewObject:(id)sender 
{ 
    //Make sure clear before we start, also make sure initalized (double redundancy with clear statement at end) 
    newTitle = @""; 

    //New Title pop up UIAlert View 
    UIAlertView * alert = [[UIAlertView alloc] 
          initWithTitle:@"New Speech" 
          message:@"Please enter a name for speech" 
          delegate:self 
          cancelButtonTitle:@"Create" 
          otherButtonTitles:nil]; 

    alert.alertViewStyle = UIAlertViewStylePlainTextInput; 

    UITextField * alertTextField = [alert textFieldAtIndex:0]; 

    alertTextField.keyboardType = UIKeyboardTypeDefault; 

    alertTextField.placeholder = @"Enter a new title"; 
    [alert show]; 


} 



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    newTitle = [[alertView textFieldAtIndex:0] text]; 

    [object addNewContent:newTitle :@"IT REALLY WORKS!" :@"Nothing"]; 

     //create new speech title, add to array and add to tableview 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

    //Clear newTitle for use next time 
    newTitle = @""; 

} 

@end 

编辑:

修正案增加了[object addNewContent]方法&类按照意见,

// 
// SpeecherDataController.m 
// speecher 
// 
// 

#import "SpeecherDataController.h" 

@interface SpeecherDataController() 
{ 
    NSMutableArray *titles; 
    NSMutableArray *content; 
    NSMutableArray *timer; 
} 
@end 

@implementation SpeecherDataController 

-(void) addNewContent:(NSString*)sTitle : (NSString*)sContent :(NSString*)sTimer 
{ 
    [titles insertObject:sTitle atIndex:0]; 
    [content insertObject:sContent atIndex:0]; 
    [timer insertObject:sTimer atIndex:0]; 
} 


//Methods to return data 
-(NSString*) returnTitle:(NSUInteger)row 
{ 
    return [titles objectAtIndex:row]; 
} 

-(NSString*) returnContent:(NSUInteger)row 
{ 
    return [content objectAtIndex:row]; 
} 

-(NSString*) returnTimer:(NSUInteger)row 
{ 
    return [timer objectAtIndex:row]; 
} 

-(NSInteger) returnNoObjects 
{ 
    return titles.count; 
} 



@end 
+1

我看不到任何错误,你所提供的代码,不过看你所得到的消息,并在“的tableView:numberOfRowsInSection:”方法,我猜你的'[object returnNoObjects]'方法没有返回正确的行数(在这种情况下为0)。 – 2012-07-22 06:38:21

+0

@NSArray你几乎没错。当看着我发现'[object addNewContent]'函数实际上并没有添加内容。修改问题以显示该功能。 – jskrwyk 2012-07-22 06:58:48

+0

尝试在添加对象后打印出'titles'数组的值。如果它没有分配,你会想要做什么JamesKraw建议。 – 2012-07-22 07:48:08

回答

1

问题是NSMutableArrays一直没alloc和初始化。必须添加一个检查,看看他们是否有一个初始化和分配,如果没有。新支票看起来像这样,

-(void) addNewContent:(NSString*)sTitle : (NSString*)sContent :(NSString*)sTimer 
{ 

    if(!titles) 
    { 
     titles = [[NSMutableArray alloc] init]; 
    } 
    if(!content) 
    { 
     content = [[NSMutableArray alloc] init]; 
    } 
    if(!timer) 
    { 
     timer = [[NSMutableArray alloc] init]; 
    } 

    [titles insertObject:sTitle atIndex:0]; 
    [content insertObject:sContent atIndex:0]; 
    [timer insertObject:sTimer atIndex:0]; 
}