UITableView переключение на разные CustomCells во время выполнения

У меня есть UITableViewс двумя разделами, второй раздел содержит UISegmentedControl в заголовке. Я хочу, чтобы пользователь мог изменить содержимое таблицы, выбрав сегмент в моем UISegmentedControl, мой TableView также изменяет внешний вид ячеек, представляя различные пользовательские ячейки, которые я создал с помощью NIB. Одно из моих требований - помнить положение прокрутки моего табличного представления для загруженных данных в моем табличном представлении, чтобы, когда пользователь нажимает на элемент управления моего сегмента, чтобы изменить содержимое табличного представления, и снова нажимает на предыдущий сегмент, мое табличное представление сможет представить данные с позиции прокрутки, которые запоминает пользователь.

Код:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 2;
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    if (section == kUserCoverSection) {
        return 0;
    }
    return 30;
}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if (section == kUserCoverSection) {
        return 1;
    }
    switch (self.userAchievementsType) {
        case kUserSilverCollections:
        {
            return [userSilverArray count];
        }
            break;
        case kUserBronzeCollections:
        {
            return [userBronzeArray count];
        }
            break;
        case kUserGoldsCollections:{
            return [userGoldsArray count];
        }
            break;

        default: return 0;
            break;
    }
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.section == kUserCoverSection) {
        return 145;
    }else{
        switch (self.userAchievementsType) {
            case kUserSilverCollections:
            case kUserBronzeCollections:
            {
                return 40;
            }
                break;
            case kUserGoldsCollections:{
                return 358;
            }
                break;
            default:{
                return 40;
            }
                break;
        }
    }


}

-(UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section {
    if (section == kUserAchievementSection) {
        SegmentControlHeader *sectionHeaderView = [self.mTableView dequeueReusableHeaderFooterViewWithIdentifier:SegmentHeaderViewIdentifier];
        [sectionHeaderView setDelegate:self];
        [sectionHeaderView.segmentControl setSelectedSegmentIndex:self.userAchievementsType];
        return sectionHeaderView;
    }
    return nil;
}
-(UITableViewCell*)tableView:(UITableView*)aTableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
    switch (indexPath.section) {
        case kUserCoverSection:
        {
            static NSString* bannerCellType = @"kCoverBannerCellIdentifier";
            CoverBannerCell *cell = (CoverBannerCell*)[aTableView dequeueReusableCellWithIdentifier:bannerCellType];

            cell.tag = indexPath.row;
            if (cell == nil) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CoverBannerCell" owner:nil options:nil];
                cell = (CoverBannerCell*)[nib objectAtIndex:0];
            }

            return cell;
        }
        break;

        case kUserAchievementSection:
        {
            switch (self.userAchievementsType) {
                case kUserGoldsCollections:
                { 
                    static NSString* cellType = @"kUserGoldsViewCellIdentifier";
                    UserGoldsViewCell *cell = (UserGoldsViewCell*)[aTableView dequeueReusableCellWithIdentifier:cellType];
                    cell.tag = indexPath.row;
                    if (cell == nil) {
                        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"UserGoldsViewCell" owner:nil options:nil];
                        cell = (UserGoldsViewCell*)[nib objectAtIndex:0];
                    }

                    return cell;
                }
                    break;
                case kUserBronzeCollections:
                case kUserSilverCollections:{
                    static NSString* cellType = @"kUserSilverCellIdentifier";
                    UserSilverCell *cell = (UserSilverCell*)[aTableView dequeueReusableCellWithIdentifier:cellType];
                    cell.tag = indexPath.row;
                    if (cell == nil) {
                        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"UserSilverCell" owner:nil options:nil];
                        cell = (UserSilverCell*)[nib objectAtIndex:0];
                    }
                    return cell;
                }
                break;

                default: { 
                    return [self defaultCell];
                }
                break;
            }

        }
        break;

        default:
            return nil;
            break;
    }

}

-(void)didChangeSegmentValue:(UISegmentedControl *)segment{
    NSInteger index = segment.selectedSegmentIndex;
    NSInteger lastSelectedIndex = self.userAchievementsType;
    switch (lastSelectedIndex) {
        case kUserGoldsCollections: offsetsArray [kUserGoldsCollections] = @(mTableView.contentOffset.y);
            break;
        case kUserSilverCollections: offsetsArray [kUserSilverCollections] = @(mTableView.contentOffset.y);
            break;
        case kUserBronzeCollections: offsetsArray [kUserBronzeCollections] = @(mTableView.contentOffset.y);
            break;
        default:
            break;
    }
    //check if last table scroll header hit top
    if ([offsetsArray[lastSelectedIndex] floatValue] > 144) {
        for (int i = 0; i < [offsetsArray count]; i++) {
            if ([offsetsArray[i] floatValue] < 145 && offsetsArray[lastSelectedIndex] != offsetsArray[i]) {
                offsetsArray[i] = @(145);
            }
        }
    }else{
        for (int i = 0; i < [offsetsArray count]; i++) {
            if ([offsetsArray [i] floatValue] <= 145 && offsetsArray[lastSelectedIndex]!=offsetsArray[i]) {
                CGFloat newOffset;
                newOffset = [offsetsArray[i] floatValue] + ([offsetsArray[lastSelectedIndex] floatValue] -[offsetsArray[i] floatValue] );
                offsetsArray [i] = @(newOffset);
            }else{
                CGFloat newOffset = [offsetsArray[lastSelectedIndex] floatValue];
                offsetsArray [i] = @(newOffset);
            }

        }
    }
    NSRange range = NSMakeRange(1, 1);
    NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];
    self.userAchievementsType = index;
    [self.mTableView beginUpdates];
    [self.mTableView reloadSections:section withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.mTableView endUpdates];
    [mTableView setContentOffset:CGPointMake(0, [offsetsArray[self.userAchievementsType] floatValue])];

}

мой TableView отображается правильно с правильными данными и правильными положениями прокрутки. Вы заметили бы в моем коде, что kUserSilverCollections а также kUserBronzeCollections отображает ту же пользовательскую ячейку и имеет одинаковую высоту, но загружает другой источник данных. У меня возникает эта проблема, когда пользователь выбирает kUserGoldsCollections (kUserGoldsCollections имеет большую высоту, чем типы kUserSilverCollections & kUserBronzeCollections) и вернитесь к типу kUserSilverCollections или же kUserBronzeCollectionsпользовательские ячейки больше не реагируют на прикосновения, кнопки внутри ячейки и сама ячейка не распознают прикосновения, есть также случай, когда реагируют последние несколько ячеек. но остальные нет.

Я пишу код в iOS 7.1 SDK. Пожалуйста, помогите мне выяснить, что вызывает эту проблему:) Спасибо!

РЕДАКТИРОВАТЬ

Я узнал, что вызывает проблему, это был мой UserGoldsViewCell теперь я чувствую себя глупо:D Мой вопрос - нехватка деталей, таких как настройки моей камеры. Я должен был включить свой код для своих ячеек в этот вопрос. Я опубликую решение / детали как ответ для будущих читателей.

2 ответа

Решение

Я нашел, что вызывает эту проблему. Это был мой UserGoldsViewCell что переопределяет hitTest:withEvent метод. Ниже была моя старая реализация метода:

- (UIView *)hitTest:(CGPoint) point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        return scrollView;
    }

    return nil;
}

Я отменяю этот метод, потому что мой UserGoldsViewCell имеет UISrollView в этом и по причине, я должен переопределить это. Причина, по которой мой UserSilverCell не реагирует на сенсорное событие после выбора UserGoldsViewCellпотому что даже представленные клетки UserSilverCell Например, hitTest:withEvent в моем UserGoldsViewCell все еще вызывается и возвращает свой scrollView. Я изменяю свою реализацию для этого метода, как показано ниже:

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    UIView* childObj = nil;
    if ((childObj = [super hitTest:point withEvent:event]) == self)
        return self.scrollView;     
    return childObj;
}

Я не знаю, почему вы используете эту методологию для Nib:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"UserSilverCell" owner:nil options:nil];
cell = (UserSilverCell*)[nib objectAtIndex:0];

Используйте это, может быть вашей проблемой:

В вашем viewDidLoad просто зарегистрируйте свой кончик для cellIdenfier:

[_yourTableView registerNib:[UINib nibWithNibName:@"UserSilverCell" 
                     bundle:[NSBundle mainBundle]] 
     forCellReuseIdentifier:@"kUserSilverCellIdentifier"];

а затем в вашем cellForRowAtIndexPath:

UserSilverCell *cell = (UserSilverCell *)[tableView     
            dequeueReusableCellWithIdentifier:@"kUserSilverCellIdentifier" 
                                 forIndexPath:indexPath];

Вы должны применить это также к другим вашим клеткам.

Это может быть проблемой, но если это ни в коем случае не поддерживать таким образом, потому что лучше с Nib,

Другие вопросы по тегам