Переключение 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; } 
  • Swift, добавление массива классов в переменную не обновляет содержимое массива в исходном классе
  • При удачном удалении часть заголовка и нижнего колонтитула TableView тоже
  • Как перетащить статическую ячейку в таблицуView swift?
  • Вращающееся колесо «карт»,
  • TableView не показывает данные?
  • iOS - использование UISearchDisplayController в UITableViewController со статическими ячейками
  • UITableView scrollToRow не работает в ios 11
  • Динамический контент UITableView не появится
  • Динамическое заполнение табличного представления iOS с помощью Swift из API
  • iOS: Поместите UIView поверх UITableView в фиксированном положении
  • Добавление UIView за UITableView приводит к тому, что вставки содержимого таблицы не совпадают с topLayoutGuide
  • Interesting Posts

    xctool: пытался установить тестовое хост-приложение, но не удалось

    Экспорт UIDocument с пользовательским файловым пакетом UTI

    Разъем VoIP на iOS – никаких уведомлений не получено

    Анимация высоты UIView при использовании автоматического макета с быстрым

    Обрезка видео AVAsset с AVFoundation

    Анимированный MKOverlayView

    Проблемы с разрешением захвата фото в iOS 11

    Я хочу создать панель управления, используя файл .traces после профилирования (Xcode Instrument). Является ли это возможным?

    Parse.com Cloud Code – установить приоритет в Apple Push Notification

    Просмотр изображения в полноэкранном режиме так же, как и приложение Facebook в IOS

    UIView border cover sub-view?

    Реализация аксессуараButtonTappedForRowWithIndexPath: в Swift 2

    Аутентификация сайта Microsoft SharePoint с использованием REST API из приложения iOS

    как получить список устройств bluetooth, используя ExternalAccessory.framework

    Накопление памяти с медленным накоплением GPUImage

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