Проблема с добавлением новой строки и ее заполнением - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь добавить новую строку в свою пользовательскую ячейку с помощью NSMutablearray от другого viewcontroller, но я получаю сообщение об ошибке при добавлении новой строки. itemsTableView виден в photoCaptureView, который является представлением для photoCaptureViewController. Поэтому, когда ScannerModalViewController (который также вызывается в photoCaptureViewController) вызывается и захватывает элемент / данные, и как только он отклоняется, вызывается scannedBarcode, чтобы добавить новую строку в мою пользовательскую ячейку и заполнить ее, я получаю эту ошибку.

Я получаю предупреждение и ошибку. Предупреждение:

Warning once only: UITableView was told to layout its visible cells and other contents without
being in the view hierarchy (the table view or one of its superviews has not been added to a
window). This may cause bugs by forcing views inside the table view to load and perform layout 
without accurate information (e.g. table view bounds, trait collection, layout margins, safe
area insets, etc), and will also cause unnecessary performance overhead due to extra layout 
passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch 
this in the debugger and see what caused this to occur, so you can avoid this action altogether 
if possible, or defer it until the table view has been added to a window. Table view:
<UITableView: 0x1038a9c00; frame = (10 70; 398 794); clipsToBounds = YES; gestureRecognizers =
<NSArray: 0x28165f0c0>; layer = <CALayer: 0x2818ebb20>; contentOffset: {0, 0}; contentSize: 
{398, 60}; adjustedContentInset: {0, 0, 0, 0}; dataSource: <PhotoCaptureViewController: 0x10364a880>>

ошибка:

Invalid update: invalid number of rows in section 0. The number of rows contained in an existing 
section after the update (3) must be equal to the number of rows contained in that section 
before the update (1), plus or minus the number of rows inserted or deleted from that section 
(1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section 
(0 moved in, 0 moved out).

Мой код - photoCaptureViewController.h

@interface PhotoCaptureViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, ScannerModalViewControllerDelegate> {
    PhotoCaptureView* photoCaptureView;
    NSMutableArray* barcodeItems;

    ScannerModalViewController* scannerModalViewController;
}

-(void) scanBarcode;
-(void) scannedBarcode:(NSString *) barcode;

@end

photoCaptureViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

    [photoCaptureView.itemsTableView registerNib:[UINib nibWithNibName:@"BarcodeItemsTableViewCell" bundle:nil] forCellReuseIdentifier:@"BarcodeItemsCell"];
    photoCaptureView.itemsTableView.rowHeight = 60;
    photoCaptureView.itemsTableView.dataSource = self;
    photoCaptureView.itemsTableView.delegate = self;
    [photoCaptureView.itemsTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
}

#pragma mark scannerModalViewController Methods
-(void) scanBarcode  {
    NSLog(@"[%@] Scan Barcode Requested", self.class);

    scannerModalViewController = [[ScannerModalViewController alloc] init];
    scannerModalViewController.delegate = self;
    scannerModalViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:scannerModalViewController animated:YES completion:nil];
}

-(void) scannedBarcode:(NSMutableArray *) barcodes {
    barcodeItems = [[NSMutableArray alloc] init];

    [barcodeItems addObjectsFromArray:barcodes];
    [barcodeItems addObject:@"test"];
    [barcodeItems addObject:@"test1"];
    NSLog(@"%@", barcodes);
    NSLog(@"%@", barcodeItems);

    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:barcodeItems.count-1 inSection:0];
    [photoCaptureView.itemsTableView beginUpdates];
    [photoCaptureView.itemsTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [photoCaptureView.itemsTableView endUpdates];
}

#pragma mark UITableViewDataSource methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return barcodeItems.count + 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Cell Initialized");
    static NSString *cellIdentifier = @"BarcodeItemsCell";

    BarcodeItemsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if (cell == nil) {
        cell = [[BarcodeItemsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    // Configure the cell...
    cell.barcodeLabel.text = [barcodeItems objectAtIndex:indexPath.row];
    UIImage *btnImage = [UIImage imageNamed:@"barcodeIcon"];
    [cell.leftButton setImage:btnImage forState:UIControlStateNormal];

    NSLog(@"Cell Populated");
    return cell;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return true;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [barcodeItems removeObjectAtIndex:indexPath.row];

        [photoCaptureView.itemsTableView beginUpdates];
        [photoCaptureView.itemsTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
        [photoCaptureView.itemsTableView endUpdates];
    }
}

@end

1 Ответ

0 голосов
/ 27 марта 2020

Если вы вставляете элементы с insertRowsAtIndexPaths, вы должны указать все пути.

И beginUpdates / endUpdates` не влияет на одну операцию вставки / удаления / перемещения.

-(void) scannedBarcode:(NSMutableArray *) barcodes {
    barcodeItems = [[NSMutableArray alloc] init];

    [barcodeItems addObjectsFromArray:barcodes];
    [barcodeItems addObject:@"test"];
    [barcodeItems addObject:@"test1"];
    NSLog(@"%@", barcodes);
    NSLog(@"%@", barcodeItems);

    NSMutableArray<NSIndexPath *>* indexPaths = [[NSMutableArray alloc] init];
    for (i = 0; i < barcodeItems.count; i++) {
       [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
    }

    [photoCaptureView.itemsTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
}

И numberOfRowsInSection должен вернуть

return barcodeItems.count;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...