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
,