Извлечение источника данных из невидимых UITableViewCells - PullRequest
1 голос
/ 30 апреля 2020

У меня есть UITableView, который представляет элементы, которые были получены как xml, а затем отсортированы по разделам и строкам. Я отслеживаю, какие элементы были отображены на экране, используя indexPathsForVisibleRows и удерживаю его в NSMutableSet:

@interface MainFeedTableViewController () <UIGestureRecognizerDelegate>
{
    NSMutableSet *viewedCellsIndexPaths;
}
@end
- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    viewedCellsIndexPaths = [[NSMutableSet alloc] init];
    ...
}
- (void) trackVisibleCells {
// create array of currently displayed cells
NSArray *visibleCells = [_mainFeed indexPathsForVisibleRows];


// add cells to viewedCells set
[viewedCellsIndexPaths addObjectsFromArray:visibleCells];


// get unviewed cells count
NSUInteger cellsCount = 0;
NSInteger sections = [_mainFeed numberOfSections];
for (int i = 0; i < sections; i++) {
    cellsCount += [_mainFeed numberOfRowsInSection:i];
}
NSUInteger unViewedCellsCount = cellsCount - [viewedCellsIndexPaths count];


// pass unviewed cells count to cell
if (self.catchupCellDelegate) {
    [self.catchupCellDelegate updateUnreadCellsCount:unViewedCellsCount];
}

, и теперь я хочу открыть новый вид, который будет отображать только элементы, которые еще не были отображается.

На основании этого ответа Я попытался создать еще один набор из источника данных, а затем [allData minusSet:viewedCellsIndexPaths]. Проблема просматриваетсяCellsIndexPaths содержит IndexPaths, а источник данных содержит, в общем, данные.

Я попытался добавить целые таблицы indexPaths к другому набору внутри CellForRowAtIndexPath, но это дало мне только видимые, а не пути к индексам всей таблицы.

Затем я попытался использовать NSMutableOrderedSet для отследите ячейки, которые были видимы, а затем вызовите его LastObject, чтобы выяснить, какая ячейка была последней просмотренной, и получить доступ к источнику данных из этого индекса:

NSIndexPath *lastIndex = (NSIndexPath *)viewedCellsIndexPaths.lastObject;

, но я получил исключение [__NSSetM lastObject]: нераспознанный селектор отправлен на экземпляр 0x2837acb2.

звучит как ошибка в языке , которую я не могу найти способ обойти.

Моя последняя попытка на основе этого ответа было:

 NSMutableArray *unviewedCellsData = [NSMutableArray arrayWithArray:sectionOrderedFeed];
    for (NSIndexPath *indexPath in viewedCellsIndexPaths) {
        Items *item = [[sectionOrderedFeed objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
        [unviewedCellsData removeObject:item];
    }

Но после итерации unViewedCellsData в точности совпадает с sectionOrderedFeed.

Здесь есть какая-нибудь помощь?

1 Ответ

0 голосов
/ 30 апреля 2020

Вот что я сделал для быстрого теста:

@interface ViewedCellsTableViewController ()
{
    NSMutableArray *myData;
    NSMutableSet *viewedCellsIndexPaths;
    NSMutableOrderedSet *orderedAllIndexPaths;
}

@end

@implementation ViewedCellsTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // just creating sample data...
    //  6 sections with a few rows in each section
    NSArray *rowsPerSection = @[@3, @5, @4, @8, @6, @7];

    myData = [NSMutableArray new];
    int iSection = 0;
    for (NSNumber *nRows in rowsPerSection) {
        NSMutableArray *aSec = [NSMutableArray new];
        for (int iRow = 0; iRow < [nRows intValue]; iRow++) {
            NSString *s = [NSString stringWithFormat:@"This is sec: %d row:%d", iSection, iRow];
            [aSec addObject:s];
        }
        [myData addObject:aSec];
        ++iSection;
    }

    // initialize ordered set of all index paths
    orderedAllIndexPaths = [NSMutableOrderedSet new];
    iSection = 0;
    for (NSArray *aSec in myData) {
        for (int iRow = 0; iRow < [aSec count]; iRow++) {
            NSIndexPath *p = [NSIndexPath indexPathForRow:iRow inSection:iSection];
            [orderedAllIndexPaths addObject:p];
        }
        ++iSection;
    }

    // init tracking set
    viewedCellsIndexPaths = [NSMutableSet new];

}

Затем, когда будете готовы двигаться дальше ...

NSMutableOrderedSet *unViewedCellsIndexPaths = [orderedAllIndexPaths mutableCopy];
[unViewedCellsIndexPaths minusSet:viewedCellsIndexPaths];

NSLog(@"\nViewed:\n%@ \n..", viewedCellsIndexPaths);
NSLog(@"");

NSLog(@"\nUn-Viewed:\n%@ \n..", unViewedCellsIndexPaths);
NSLog(@"");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...