2012-07-22 68 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]; 
}