Переключение UITableView на различные пользовательские устройства во время выполнения

У меня есть UITableView с двумя разделами, второй раздел содержит UISegmentedControl в его заголовке. У меня есть эта опция для пользователя, чтобы изменить содержимое 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 отображает kUserSilverCollections и kUserBronzeCollections же пользовательскую ячейку и имеют ту же самую высоту, но загружают другой источник данных. У меня возникает эта проблема, когда пользователь выбирает kUserGoldsCollections ( kUserGoldsCollections имеет большую высоту, чем типы kUserSilverCollections и kUserBronzeCollections ) и вернитесь к типу kUserSilverCollections или kUserBronzeCollections , пользовательские ячейки больше не реагируют на касания, кнопки внутри ячейки и сама ячейка не распознают касания, есть также случай, когда последние несколько ячеек отвечают. но остальные – нет.

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

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

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

2 Solutions collect form web for “Переключение UITableView на различные пользовательские устройства во время выполнения”

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

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

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

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

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

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

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

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

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

Я нашел причину этой проблемы. Именно мой 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 прежнему 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; } 
  • Множество разных UITableViewCells в одном TableView
  • Как устранить проблему Disappearing / Invisible / Empty UITableViewCells в Swift?
  • Создать индекс для UITableView из NSArray
  • Форматирование UITableView Cells в iphone
  • Как удалить ячейку из статического UITableView, созданного в Storyboard
  • Почему: «Попытка загрузить .. при освобождении ...: UISearchController:
  • tableview - непризнанный селектор didSelectRowAtIndexPath
  • UIPageViewController в UITableViewCell
  • Вращающееся колесо «карт»,
  • Переупорядочение, вызывающее цвет подсветки subview
  • iOS 8 серый ящик над UITableView
  • Добавление программ программно в UITableView
  • Interesting Posts

    попытка встроить объект PPSSignatureView

    UICollectionView с динамической высотой, не получающей одинакового пространства между ячейками

    if (NSOrderedAscending == result) может кто-нибудь объяснить это

    PhoneGap 1.4 wrapping Sencha Touch 2.X – Как насчет производительности?

    Настроить атрибуты заголовка конкретной кнопки возврата

    Как добавить теневой эффект для панели UINavigation

    запустить UI-тест xcode 7 на устройстве

    Каков рекомендуемый способ связи модели с контроллером?

    SLComposeViewController автоматически закрывается при совместном использовании на Facebook в iOS 8

    Где изменить «установлен» для ограничения автоматической компоновки?

    iOS 6, Как настроить иконки UIBarButtonItem?

    Как установить непрочитанное или прочитанное сообщение с использованием API Gmail с использованием SDK цели?

    iOS 7 выдает BAD_ACCESS при использовании UIImagePickerController

    Текущая высота ячейки внутри heightForRowAtIndexPath?

    Как установить фоновое изображение в Xcode с помощью swift?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.