iphone - uitableview 单元格中的自定义复选框出现错误

标签 iphone ios objective-c uitableview checkbox

我收到错误:* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试将第 0 行插入第 0 部分,但更新后第 0 部分中只有 0 行”*

我有 2 个部分,我试图将其设置为当您单击其中一个部分中单元格的复选框时,它会转到另一个部分(例如:第 1 部分 -> 第 2 部分)

这是我的一些相关代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (!cell)
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
    if([indexPath section] == 0){
    cell.textLabel.text = [[[taskArray objectAtIndex:[indexPath row]] taskName] uppercaseString];
    cell.imageView.image = [UIImage imageNamed:@"checkboxtry2.png"];
    } else if ([indexPath section] == 1) {
    cell.textLabel.text = [[[completedArray objectAtIndex:[indexPath row]] taskName] uppercaseString];
     cell.imageView.image = [UIImage imageNamed:@"checkboxtry2selected.png"];
    }

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handlechecking:)];
    [cell.imageView addGestureRecognizer:tap];
    cell.imageView.userInteractionEnabled = YES;
    return cell;
}
-(void)handlechecking:(UITapGestureRecognizer *)t{
        CGPoint tapLocation = [t locationInView:self.tableView];
        NSIndexPath *tappedIndexPath = [self.tableView indexPathForRowAtPoint:tapLocation];

        if (tappedIndexPath.section == 0) {
            [completedArray addObject:[taskArray objectAtIndex:tappedIndexPath.row]];
            [taskArray removeObject:[taskArray objectAtIndex:tappedIndexPath.row]];
        }
        else {
            [taskArray addObject:[completedArray objectAtIndex:tappedIndexPath.row]];
            [completedArray removeObject:[completedArray objectAtIndex:tappedIndexPath.row]];
        }
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:tappedIndexPath] withRowAnimation: UITableViewRowAnimationFade];
}

我有两个数组:taskArray 处理第 0 部分中的对象,completedArray 处理第 1 部分中的对象。

---编辑--- 这是我现在所拥有的: TableViewController.h

@interface ToDoTableViewController : UITableViewController <Properties2ViewControllerDelegate, UITableViewDelegate, SettingsViewControllerDelegate>
@property (strong, nonatomic) NSMutableArray *taskArray;
@property (strong, nonatomic) NSMutableArray *completedArray;
@property (strong, nonatomic) NSMutableArray *holdViewsArray;
-(IBAction)addCell:(id)sender;
-(void)buttonPressed:(id)sender;
-(void)handlechecking:(UITapGestureRecognizer *)t;

TableViewController.m

-(void) viewDidLoad{
    [self.tableView setDelegate:self];
    [self setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];

    taskArray = [[NSMutableArray alloc] init];
    completedArray = [[NSMutableArray alloc]init];
    holdViewsArray = [[NSMutableArray alloc]init];
   }
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (!cell)
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
    NSString *detailText = [NSString stringWithFormat:@"%.0f", [[taskArray objectAtIndex:[indexPath row]] timeInterval]];
    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    [cell setBackgroundColor:[UIColor colorWithRed:236.0/255 green:240.0/255 blue:241.0/255 alpha:1.0f]];
    cell.textLabel.textColor = baseColor;
    [[cell detailTextLabel] setText:detailText];
    [[cell detailTextLabel] setFont:[UIFont fontWithName:@"Avenir-Black" size:12]];
    [[cell textLabel] setFont:[UIFont fontWithName:@"AvenirNext-DemiBold" size:16]];

    if([indexPath section] == 0){
    cell.textLabel.text = [[[taskArray objectAtIndex:[indexPath row]] taskName] uppercaseString];
    cell.imageView.image = [UIImage imageNamed:@"unchecked.png"];
    } else if ([indexPath section] == 1) {
    cell.textLabel.text = [[[completedArray objectAtIndex:[indexPath row]] taskName] uppercaseString];
     cell.imageView.image = [UIImage imageNamed:@"checked.png"];
    }

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handlechecking:)];
    [cell.imageView addGestureRecognizer:tap];
    cell.imageView.userInteractionEnabled = YES;
    return cell;

}
-(void)handlechecking:(UITapGestureRecognizer *)t{

        CGPoint tapLocation = [t locationInView:self.tableView];
        NSIndexPath *tappedIndexPath = [self.tableView indexPathForRowAtPoint:tapLocation];
        NSIndexPath *newIndexPath = nil;

        if (tappedIndexPath.section == 0) {

            NSUInteger newRowIndex = self.completedArray.count;
            [self.completedArray addObject:[self.taskArray objectAtIndex:tappedIndexPath.row]];
            [self.taskArray removeObject:[self.taskArray objectAtIndex:tappedIndexPath.row]];
            newIndexPath = [NSIndexPath indexPathForRow:newRowIndex inSection:1];
        } else {

            NSUInteger newRowIndex = self.taskArray.count;
            [self.taskArray addObject:[self.completedArray objectAtIndex:tappedIndexPath.row]];
            [self.completedArray removeObject:[self.completedArray objectAtIndex:tappedIndexPath.row]];
            newIndexPath = [NSIndexPath indexPathForRow:newRowIndex inSection:0];
        }
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView deleteRowsAtIndexPaths:@[tappedIndexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    NSInteger num = 0;
    if (section == 0) {
        num = self.taskArray.count;
    } else {
        num = self.completedArray.count;
    }
    return num;
}


 -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
   Tasks *taskToMove = [taskArray objectAtIndex:[sourceIndexPath row]];
    if (sourceIndexPath.row > destinationIndexPath.row) {
        [taskArray insertObject:taskToMove atIndex:destinationIndexPath.row];
        [taskArray removeObjectAtIndex:(sourceIndexPath.row + 1)];
    }
    else if (sourceIndexPath.row < destinationIndexPath.row) {
        [taskArray insertObject:taskToMove atIndex:(destinationIndexPath.row + 1)];
        [taskArray removeObjectAtIndex:(sourceIndexPath.row)];
    }
}
-(IBAction)addCell:(id)sender{
    Properties2ViewController *pvc = [[Properties2ViewController alloc]init];
    [pvc setDelegate:self];
    [self presentViewController:pvc animated:YES completion:NULL];
    [pvc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
}
-(void)properties2ViewControllerDidEnterPropertiesSuccesfully:(Tasks *)t{
    if (![[t taskName] isEqual: @""]) {
    [taskArray addObject:t];
    }
    [self.tableView reloadData];
}

Properties2ViewController.m

-(IBAction)dismiss:(id)sender{
    testTask = [[Tasks alloc]init];
    testTask.taskName = taskName.text;
    testTask.timeInterval = datePicker.countDownDuration;
    testTask.dateCreated = [NSDate date];
    if ([self.delegate respondsToSelector:@selector (properties2ViewControllerDidEnterPropertiesSuccesfully:)]){
        [self.delegate properties2ViewControllerDidEnterPropertiesSuccesfully:testTask];
    }
    [self dismissViewControllerAnimated:YES completion:NULL];
}

Properties2viewcontroller是一个模态 Controller ,它将Task对象添加到taskArray中。

最佳答案

您正在尝试重新加载行,但您实际想要做的是从第 0 节中删除行并将其添加到第 1 节中,反之亦然。所以在handlechecking方法中你必须写这样的东西:

-(void)handlechecking:(UITapGestureRecognizer *)t{

CGPoint tapLocation = [t locationInView:self.tableView];
NSIndexPath *tappedIndexPath = [self.tableView indexPathForRowAtPoint:tapLocation];
NSIndexPath *newIndexPath = nil;

if (tappedIndexPath.section == 0) {

    NSUInteger newRowIndex = self.sectionTwoArr.count;
    [self.sectionTwoArr addObject:[self.sectionOneArr objectAtIndex:tappedIndexPath.row]];
    [self.sectionOneArr removeObject:[self.sectionOneArr objectAtIndex:tappedIndexPath.row]];
    newIndexPath = [NSIndexPath indexPathForRow:newRowindex inSection:1];
} else {

    NSUInteger newRowIndex = self.sectionOneArr.count;
    [self.sectionOneArr addObject:[self.sectionTwoArr objectAtIndex:tappedIndexPath.row]];
    [self.sectionTwoArr removeObject:[self.sectionTwoArr objectAtIndex:tappedIndexPath.row]];
    newIndexPath = [NSIndexPath indexPathForRow:newRowindex inSection:0];
}
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView deleteRowsAtIndexPaths:@[tappedIndexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}

编辑

其他方法的完整实现

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.sectionOneArr = [@[@"ololo", @"dsd", @"dsdfsf"] mutableCopy];
    self.sectionTwoArr = [@[@"ototo",@"dd", @"sdfsdfsd"] mutableCopy];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 2;
}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSInteger num = 0;
    if (section == 0) {
        num = self.sectionOneArr.count;
    } else {
        num = self.sectionTwoArr.count;
    }
    return num;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (!cell)
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
    if([indexPath section] == 0){
        cell.textLabel.text = [[self.sectionOneArr objectAtIndex:[indexPath row]] uppercaseString];
        cell.imageView.image = [UIImage imageNamed:@"unchecked.jpeg"];
    } else if ([indexPath section] == 1) {
        cell.textLabel.text = [[self.sectionTwoArr objectAtIndex:[indexPath row]] uppercaseString];
        cell.imageView.image = [UIImage imageNamed:@"checked.jpeg"];
    }

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handlechecking:)];
    [cell.imageView addGestureRecognizer:tap];
    cell.imageView.userInteractionEnabled = YES;

    return cell;
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    NSString * num = nil;
    if (section == 0) {
        num = @"One";
    } else {
        num = @"Two";
    }
    return num;
}

关于iphone - uitableview 单元格中的自定义复选框出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17462977/

相关文章:

ios - 在 iTunes Connect 中添加 Sandbox Tester 时出现 Java.lang.NullPointerException 错误

ios - Swift 3 Firebase 更新代码转换 - 排序

objective-c - 简单的写入文件对我来说不起作用

objective-c - 如何从 UITableview 的边缘获取填充到 UITableViewCell

iphone - UITableView 作为 subview ?

iphone - iOS6 : do we have to set rootViewController in App delegate in order to support different orientations?

ios - 坐标空间之间的转换 SpriteKit

iphone - 换行符在 UI​​Label 中不起作用

ios - 滚动几次后,cellForRowAtIndexPath 变慢

ios - 无法识别的选择器 UIDeviceRGBColor countByEnumeratingWithState :objects:count: