gpt4 book ai didi

ios - cordova/ios/hybrid 应用程序 - UITableView 加载项目不正确且无序

转载 作者:行者123 更新时间:2023-11-28 23:37:35 25 4
gpt4 key购买 nike

我的 UITableView 出现了奇怪的行为。它正在加载行 0, 1, 2 - 但是当它到达行 3 时,它会加载行 4 ,然后加载行 4,它再次加载行0,所以它是这样的:

表中的行:

0
1
2
4
0

显然应该按顺序 0, 1, 2, 3, 4 进行。这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"cellForRowAtIndexPath getting called - row: %li", indexPath.row);

[self.items enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"items at every cell entry: %@", [obj valueForKey:@"item"]);
}];

//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell1" forIndexPath:indexPath];
//NSLog(@"indexPath.row: %li, %@", (long)indexPath.row, [self.items objectAtIndex:indexPath.row]);

PoolsTableViewCell *cell = (PoolsTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

if(cell.cellLeftImageView.image == nil) {

NSInteger left = 2*indexPath.row;
NSLog(@"left: %li", (long)left);

NSObject* obj = (NSObject*)[self.items objectAtIndex:left];

cell.cellLeftViewLabel.text = [obj valueForKey:@"item"];

NSString *ImageURL = [obj valueForKey:@"downloadURL"];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
cell.cellLeftImageView.image = [UIImage imageWithData:imageData];

NSInteger right = (2*indexPath.row)+1;
NSLog(@"right: %li", (long)right);

if(right < [self.items count]) {
NSLog(@"inside right < self.items count conditional");
NSObject* objPlus = (NSObject*)[self.items objectAtIndex:right];

cell.cellRightViewLabel.text = [objPlus valueForKey:@"item"];

NSString *secondImageURL = [objPlus valueForKey:@"downloadURL"];
NSData *secondImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:secondImageURL]];
cell.cellRightImageView.image = [UIImage imageWithData:secondImageData];
}
}

return cell;
}

我有这段代码,每次调用 cellForRowAtIndex 时都会记录所有项目:

[self.items enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, 
BOOL * _Nonnull stop) {
NSLog(@"items at every cell entry: %@", [obj valueForKey:@"item"]);
}];

我正在将 self.items 中的 2 个项目加载到每行中(每行本质上有 2 列)。控制台输出对于 cellForRowAtIndexPath 的每次调用都是正确的 - 所以 self.items 不应该被乱序引用,但它是 - 这是我的控制台输出的一个例子UITableView 加载:

2019-02-02 22:01:30.121975-0500 HybridPool[1720:534623] cellForRowAtIndexPath getting called - row: 0
2019-02-02 22:01:30.122149-0500 HybridPool[1720:534623] items at ever cell entry: Table
2019-02-02 22:01:30.122263-0500 HybridPool[1720:534623] items at ever cell entry: Cord
2019-02-02 22:01:30.122373-0500 HybridPool[1720:534623] items at ever cell entry: Keys
2019-02-02 22:01:30.122645-0500 HybridPool[1720:534623] items at ever cell entry: Hshhdhdbd
2019-02-02 22:01:30.122769-0500 HybridPool[1720:534623] items at ever cell entry: Jhghhvhh
2019-02-02 22:01:30.122947-0500 HybridPool[1720:534623] items at ever cell entry: Book
2019-02-02 22:01:30.123054-0500 HybridPool[1720:534623] items at ever cell entry: Njhhnn
2019-02-02 22:01:30.123160-0500 HybridPool[1720:534623] items at ever cell entry: Tv
2019-02-02 22:01:30.123260-0500 HybridPool[1720:534623] items at ever cell entry: 9th item
2019-02-02 22:01:30.129478-0500 HybridPool[1720:534623] left: 0
2019-02-02 22:01:31.024184-0500 HybridPool[1720:534623] right: 1
2019-02-02 22:01:31.024302-0500 HybridPool[1720:534623] inside right < self.items count conditional
2019-02-02 22:01:31.719052-0500 HybridPool[1720:534623] cellForRowAtIndexPath getting called - row: 1
2019-02-02 22:01:31.719252-0500 HybridPool[1720:534623] items at ever cell entry: Table
2019-02-02 22:01:31.719374-0500 HybridPool[1720:534623] items at ever cell entry: Cord
2019-02-02 22:01:31.719481-0500 HybridPool[1720:534623] items at ever cell entry: Keys
2019-02-02 22:01:31.719584-0500 HybridPool[1720:534623] items at ever cell entry: Hshhdhdbd
2019-02-02 22:01:31.719687-0500 HybridPool[1720:534623] items at ever cell entry: Jhghhvhh
2019-02-02 22:01:31.719785-0500 HybridPool[1720:534623] items at ever cell entry: Book
2019-02-02 22:01:31.719884-0500 HybridPool[1720:534623] items at ever cell entry: Njhhnn
2019-02-02 22:01:31.720048-0500 HybridPool[1720:534623] items at ever cell entry: Tv
2019-02-02 22:01:31.720170-0500 HybridPool[1720:534623] items at ever cell entry: 9th item
2019-02-02 22:01:31.724875-0500 HybridPool[1720:534623] left: 2
2019-02-02 22:01:32.340747-0500 HybridPool[1720:534623] right: 3
2019-02-02 22:01:32.340969-0500 HybridPool[1720:534623] inside right < self.items count conditional
2019-02-02 22:01:32.776360-0500 HybridPool[1720:534623] cellForRowAtIndexPath getting called - row: 2
2019-02-02 22:01:32.776572-0500 HybridPool[1720:534623] items at ever cell entry: Table
2019-02-02 22:01:32.776685-0500 HybridPool[1720:534623] items at ever cell entry: Cord
2019-02-02 22:01:32.776877-0500 HybridPool[1720:534623] items at ever cell entry: Keys
2019-02-02 22:01:32.777113-0500 HybridPool[1720:534623] items at ever cell entry: Hshhdhdbd
2019-02-02 22:01:32.777244-0500 HybridPool[1720:534623] items at ever cell entry: Jhghhvhh
2019-02-02 22:01:32.777344-0500 HybridPool[1720:534623] items at ever cell entry: Book
2019-02-02 22:01:32.777443-0500 HybridPool[1720:534623] items at ever cell entry: Njhhnn
2019-02-02 22:01:32.777542-0500 HybridPool[1720:534623] items at ever cell entry: Tv
2019-02-02 22:01:32.777641-0500 HybridPool[1720:534623] items at ever cell entry: 9th item
2019-02-02 22:01:32.782148-0500 HybridPool[1720:534623] left: 4
2019-02-02 22:01:33.383439-0500 HybridPool[1720:534623] right: 5
2019-02-02 22:01:33.383649-0500 HybridPool[1720:534623] inside right < self.items count conditional
2019-02-02 22:01:34.534761-0500 HybridPool[1720:534623] cellForRowAtIndexPath getting called - row: 3
2019-02-02 22:01:34.534980-0500 HybridPool[1720:534623] items at ever cell entry: Table
2019-02-02 22:01:34.535099-0500 HybridPool[1720:534623] items at ever cell entry: Cord
2019-02-02 22:01:34.535206-0500 HybridPool[1720:534623] items at ever cell entry: Keys
2019-02-02 22:01:34.535310-0500 HybridPool[1720:534623] items at ever cell entry: Hshhdhdbd
2019-02-02 22:01:34.535412-0500 HybridPool[1720:534623] items at ever cell entry: Jhghhvhh
2019-02-02 22:01:34.535666-0500 HybridPool[1720:534623] items at ever cell entry: Book
2019-02-02 22:01:34.535787-0500 HybridPool[1720:534623] items at ever cell entry: Njhhnn
2019-02-02 22:01:34.535895-0500 HybridPool[1720:534623] items at ever cell entry: Tv
2019-02-02 22:01:34.536022-0500 HybridPool[1720:534623] items at ever cell entry: 9th item
2019-02-02 22:01:34.540261-0500 HybridPool[1720:534623] left: 6
2019-02-02 22:01:35.090979-0500 HybridPool[1720:534623] right: 7
2019-02-02 22:01:35.091111-0500 HybridPool[1720:534623] inside right < self.items count conditional
2019-02-02 22:01:35.886101-0500 HybridPool[1720:534623] cellForRowAtIndexPath getting called - row: 4
2019-02-02 22:01:35.886329-0500 HybridPool[1720:534623] items at ever cell entry: Table
2019-02-02 22:01:35.886446-0500 HybridPool[1720:534623] items at ever cell entry: Cord
2019-02-02 22:01:35.886554-0500 HybridPool[1720:534623] items at ever cell entry: Keys
2019-02-02 22:01:35.886658-0500 HybridPool[1720:534623] items at ever cell entry: Hshhdhdbd
2019-02-02 22:01:35.886978-0500 HybridPool[1720:534623] items at ever cell entry: Jhghhvhh
2019-02-02 22:01:35.887082-0500 HybridPool[1720:534623] items at ever cell entry: Book
2019-02-02 22:01:35.887184-0500 HybridPool[1720:534623] items at ever cell entry: Njhhnn
2019-02-02 22:01:35.887311-0500 HybridPool[1720:534623] items at ever cell entry: Tv
2019-02-02 22:01:35.887449-0500 HybridPool[1720:534623] items at ever cell entry: 9th item
2019-02-02 22:01:35.891688-0500 HybridPool[1720:534623] left: 8
2019-02-02 22:01:36.660758-0500 HybridPool[1720:534623] right: 9
2019-02-02 22:01:36.931630-0500 HybridPool[1720:534623] Item added! pool

为了澄清我在表格中看到的 self.items 中的项目名称,如下所示:

**Row 0:**
Table, Cord
**Row 1:**
Keys, Hshhdhdbd
**Row 2:**
Jhghhvhh, Book
**Row 3:**
9th item, (blank - because there are only 9 items - not an even 10) --> this row should be last!
**Row 4:**
Table, Cord <- this is the first row again, this should be what is in **Row 3** - 9th item, blank.

我还应该展示这一点,以防万一我在这里做错了什么:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
if([self.items count] % 2 != 0) {
return ([self.items count] + 1) / 2;
}
else {
return [self.items count] / 2;
}
}

对于上面的内容,因为我将两个项目加载到行中,所以我会处理项目数量为偶数的情况(这只是将 [self.items count] 除以 2。对于奇数数量的 self.items,我在除以 2 之前添加 1,以便有一行可用对于最后一项(然后该行中的一个位置留空)。这对我来说似乎是正确的,但也许我在这里遗漏了一些棘手的错误?

从控制台输出来看,我不知道为什么行被乱序加载,或者为什么 Row 0 重复 Row 4,请帮忙,谢谢!

更新

与此得到相同的结果:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"cellForRowAtIndexPath getting called - row: %li", indexPath.row);

[self.leftItems enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"leftItem: %@", [obj valueForKey:@"item"]);
}];

[self.rightItems enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"rightItem: %@", [obj valueForKey:@"item"]);
}];

//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell1" forIndexPath:indexPath];
//NSLog(@"indexPath.row: %li, %@", (long)indexPath.row, [self.items objectAtIndex:indexPath.row]);

PoolsTableViewCell *cell = (PoolsTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

if(cell.cellLeftImageView.image == nil) { //Equivalent to cell == nil
NSObject* leftObj = [self.leftItems objectAtIndex:indexPath.row];
NSObject* rightObj = [self.rightItems objectAtIndex:indexPath.row];

cell.cellLeftViewLabel.text = [leftObj valueForKey:@"item"];

NSString *ImageURL = [leftObj valueForKey:@"downloadURL"];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
cell.cellLeftImageView.image = [UIImage imageWithData:imageData];

if(![rightObj isEqual:[NSNull null]]) {
cell.cellRightViewLabel.text = [rightObj valueForKey:@"item"];

NSString *secondImageURL = [rightObj valueForKey:@"downloadURL"];
NSData *secondImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:secondImageURL]];
cell.cellRightImageView.image = [UIImage imageWithData:secondImageData];
}
else {
cell.cellRightViewLabel.text = @"";
cell.cellRightImageView.image = nil;
}
}

return cell;
}

控制台输出:

2019-02-03 11:32:50.583214-0500 HybridPool[1827:594545] cellForRowAtIndexPath getting called - row: 0
2019-02-03 11:32:50.583377-0500 HybridPool[1827:594545] leftItem: Table
2019-02-03 11:32:50.583486-0500 HybridPool[1827:594545] leftItem: Keys
2019-02-03 11:32:50.583605-0500 HybridPool[1827:594545] leftItem: Jhghhvhh
2019-02-03 11:32:50.583997-0500 HybridPool[1827:594545] leftItem: Njhhnn
2019-02-03 11:32:50.584116-0500 HybridPool[1827:594545] leftItem: 9th item
2019-02-03 11:32:50.584224-0500 HybridPool[1827:594545] rightItem: Cord
2019-02-03 11:32:50.584328-0500 HybridPool[1827:594545] rightItem: Hshhdhdbd
2019-02-03 11:32:50.584429-0500 HybridPool[1827:594545] rightItem: Book
2019-02-03 11:32:50.584528-0500 HybridPool[1827:594545] rightItem: Tv
2019-02-03 11:32:50.584771-0500 HybridPool[1827:594545] rightItem: <null>
2019-02-03 11:32:54.647304-0500 HybridPool[1827:594545] cellForRowAtIndexPath getting called - row: 1
2019-02-03 11:32:54.647551-0500 HybridPool[1827:594545] leftItem: Table
2019-02-03 11:32:54.647666-0500 HybridPool[1827:594545] leftItem: Keys
2019-02-03 11:32:54.647773-0500 HybridPool[1827:594545] leftItem: Jhghhvhh
2019-02-03 11:32:54.647876-0500 HybridPool[1827:594545] leftItem: Njhhnn
2019-02-03 11:32:54.647992-0500 HybridPool[1827:594545] leftItem: 9th item
2019-02-03 11:32:54.648102-0500 HybridPool[1827:594545] rightItem: Cord
2019-02-03 11:32:54.648199-0500 HybridPool[1827:594545] rightItem: Hshhdhdbd
2019-02-03 11:32:54.648403-0500 HybridPool[1827:594545] rightItem: Book
2019-02-03 11:32:54.648519-0500 HybridPool[1827:594545] rightItem: Tv
2019-02-03 11:32:54.648769-0500 HybridPool[1827:594545] rightItem: <null>
2019-02-03 11:32:56.447403-0500 HybridPool[1827:594545] cellForRowAtIndexPath getting called - row: 2
2019-02-03 11:32:56.447610-0500 HybridPool[1827:594545] leftItem: Table
2019-02-03 11:32:56.447724-0500 HybridPool[1827:594545] leftItem: Keys
2019-02-03 11:32:56.447829-0500 HybridPool[1827:594545] leftItem: Jhghhvhh
2019-02-03 11:32:56.447931-0500 HybridPool[1827:594545] leftItem: Njhhnn
2019-02-03 11:32:56.448151-0500 HybridPool[1827:594545] leftItem: 9th item
2019-02-03 11:32:56.448281-0500 HybridPool[1827:594545] rightItem: Cord
2019-02-03 11:32:56.448389-0500 HybridPool[1827:594545] rightItem: Hshhdhdbd
2019-02-03 11:32:56.448490-0500 HybridPool[1827:594545] rightItem: Book
2019-02-03 11:32:56.448589-0500 HybridPool[1827:594545] rightItem: Tv
2019-02-03 11:32:56.448689-0500 HybridPool[1827:594545] rightItem: <null>
2019-02-03 11:32:57.981261-0500 HybridPool[1827:594545] cellForRowAtIndexPath getting called - row: 3
2019-02-03 11:32:57.981471-0500 HybridPool[1827:594545] leftItem: Table
2019-02-03 11:32:57.981625-0500 HybridPool[1827:594545] leftItem: Keys
2019-02-03 11:32:57.981745-0500 HybridPool[1827:594545] leftItem: Jhghhvhh
2019-02-03 11:32:57.981874-0500 HybridPool[1827:594545] leftItem: Njhhnn
2019-02-03 11:32:57.982081-0500 HybridPool[1827:594545] leftItem: 9th item
2019-02-03 11:32:57.982214-0500 HybridPool[1827:594545] rightItem: Cord
2019-02-03 11:32:57.982315-0500 HybridPool[1827:594545] rightItem: Hshhdhdbd
2019-02-03 11:32:57.982441-0500 HybridPool[1827:594545] rightItem: Book
2019-02-03 11:32:57.982539-0500 HybridPool[1827:594545] rightItem: Tv
2019-02-03 11:32:57.982638-0500 HybridPool[1827:594545] rightItem: <null>
2019-02-03 11:33:00.735076-0500 HybridPool[1827:594545] cellForRowAtIndexPath getting called - row: 4
2019-02-03 11:33:00.735252-0500 HybridPool[1827:594545] leftItem: Table
2019-02-03 11:33:00.735337-0500 HybridPool[1827:594545] leftItem: Keys
2019-02-03 11:33:00.735410-0500 HybridPool[1827:594545] leftItem: Jhghhvhh
2019-02-03 11:33:00.735480-0500 HybridPool[1827:594545] leftItem: Njhhnn
2019-02-03 11:33:00.735547-0500 HybridPool[1827:594545] leftItem: 9th item
2019-02-03 11:33:00.735692-0500 HybridPool[1827:594545] rightItem: Cord
2019-02-03 11:33:00.735762-0500 HybridPool[1827:594545] rightItem: Hshhdhdbd
2019-02-03 11:33:00.735830-0500 HybridPool[1827:594545] rightItem: Book
2019-02-03 11:33:00.735896-0500 HybridPool[1827:594545] rightItem: Tv
2019-02-03 11:33:00.735965-0500 HybridPool[1827:594545] rightItem: <null>
2019-02-03 11:33:01.876340-0500 HybridPool[1827:594545] Item added! pool
2019-02-03 11:33:03.352399-0500 HybridPool[1827:594545] cellForRowAtIndexPath getting called - row: 3
2019-02-03 11:33:03.352967-0500 HybridPool[1827:594545] leftItem: Table
2019-02-03 11:33:03.353179-0500 HybridPool[1827:594545] leftItem: Keys
2019-02-03 11:33:03.353377-0500 HybridPool[1827:594545] leftItem: Jhghhvhh
2019-02-03 11:33:03.353569-0500 HybridPool[1827:594545] leftItem: Njhhnn
2019-02-03 11:33:03.353755-0500 HybridPool[1827:594545] leftItem: 9th item
2019-02-03 11:33:03.353897-0500 HybridPool[1827:594545] rightItem: Cord
2019-02-03 11:33:03.354230-0500 HybridPool[1827:594545] rightItem: Hshhdhdbd
2019-02-03 11:33:03.354612-0500 HybridPool[1827:594545] rightItem: Book
2019-02-03 11:33:03.354739-0500 HybridPool[1827:594545] rightItem: Tv
2019-02-03 11:33:03.354848-0500 HybridPool[1827:594545] rightItem: <null>
2019-02-03 11:33:03.477654-0500 HybridPool[1827:594545] cellForRowAtIndexPath getting called - row: 4
2019-02-03 11:33:03.477863-0500 HybridPool[1827:594545] leftItem: Table
2019-02-03 11:33:03.477974-0500 HybridPool[1827:594545] leftItem: Keys
2019-02-03 11:33:03.478078-0500 HybridPool[1827:594545] leftItem: Jhghhvhh
2019-02-03 11:33:03.478178-0500 HybridPool[1827:594545] leftItem: Njhhnn
2019-02-03 11:33:03.478276-0500 HybridPool[1827:594545] leftItem: 9th item
2019-02-03 11:33:03.478374-0500 HybridPool[1827:594545] rightItem: Cord
2019-02-03 11:33:03.478472-0500 HybridPool[1827:594545] rightItem: Hshhdhdbd
2019-02-03 11:33:03.478569-0500 HybridPool[1827:594545] rightItem: Book
2019-02-03 11:33:03.478665-0500 HybridPool[1827:594545] rightItem: Tv
2019-02-03 11:33:03.478763-0500 HybridPool[1827:594545] rightItem: <null>

最佳答案

TableView 中的 View 可以重复使用,因此您对 View 所做的所有操作也必须撤消。我的规则是任何涉及可重用 View 的代码都不能有 if 而没有 else。话虽这么说:

if(cell.cellLeftImageView.image == nil) {

是一个错误。第一次将正确设置 View ,但第二次,当 View 被重新使用时,它根本不会被设置。

如果:

if(right < [self.items count]) {

也是一个错误。如果没有正确的项目,它不会将图像设置为 nil,而是保留之前存在的任何图像。

还有一个数据源,其中奇数和偶数意味着完全不同的东西真的很难跟踪和理解。你为什么要这么做?您可以拥有具有 leftImageURLrightImageURLleftTextrightText 的对象。编码的一部分是为了与其他程序员交流,而不是与编译器交流。选择一个更容易理解的数据结构对于使代码按照您的预期行事大有帮助。

接下来,您将使用 dataWithContentsOfURL,它会在您请求图像时阻塞主线程。我假设这只是文本代码,并不打算以任何严肃的方式使用。

此外,您为什么要使用 valueForKeyitems 的类型是什么?如果它们是字典,您可以使用 item[@"downloadURL"],如果它们是一些自定义对象,您应该能够只使用 item.downloadURL。

关于ios - cordova/ios/hybrid 应用程序 - UITableView 加载项目不正确且无序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com