Как заполнить пользовательскую ячейку UIPickerView

Я хотел заполнить ячейки UICollectionView. Я создал настраиваемую ячейку, состоящую из метки и TextFiled, чей inputView я изменил на UIPickerView программно, поэтому он будет вести себя как pickerview, мой вопрос: у меня есть настраиваемая ячейка .h и .m файл, и у меня есть один класс контроллера, представление коллекции работает нормально, но я не могу добавить данные в UIPickerview, поскольку они находятся в отдельном файле .h, поэтому его делегат pickerview и методы источника данных будут в его файле .m.

Но мои данные находятся в основном классе VC, как мне заполнить окно выбора из VC?

Я новичок в объективе c и извините, если не объяснил мою проблему четко

Я уже пытался получить ячейку в своем классе VC и заполнить окно выбора ячейки в классе VC, но это не сработает, потому что я не могу получить доступ к полям ячейки снаружи - метод (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{}.

  - (NSInteger)numberOfComponentsInPickerView:(nonnull UIPickerView *)pickerView {
    return 1;
}


    - (NSInteger)pickerView:(nonnull UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (pickerView.tag==0){
        return outboundBaggages.count;
    }
    return 0;
}


    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    if (pickerView.tag==0){
        NSString *key = [NSString stringWithFormat:@"%ld",(long)row];
        ssrDescription = listOfOutboundSSR[key];
        //cell.ssrTextField.text = listOfOutboundSSR[key];
       //above line should be the right but it is field of cell and i 
       //can not access it outside of collectionview's method 
    }
}


    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if (pickerView.tag==0){
         NSString *key = [NSString stringWithFormat:@"%ld",(long)row];
        return listOfOutboundSSR[key];
    }
    return nil;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
444
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно будет создать свойство в контроллере, т. е. selectedCell с DataType в качестве вашего пользовательского типа класса ячеек.

В приведенном ниже источнике данных UICollectionView соответствует UITextfieldDelegate.

(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

///....
cell.textfield.delegate = self; 
}

Теперь реализуйте метод делегата текстового поля и присвойте значение selectedCell.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

   CGPoint tfPosition = [textField convertPoint:CGPointZero toView:self.collectionView];
   NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:tfPosition];
   selectedCell = [self.collectionView cellForItemAtIndexPath: indexPath];
}

Теперь вы можете использовать selectedCell в источнике данных UIPIckerView, методы делегата //selectedCell.ssrTextField.text = listOfOutboundSSR[key];

спасибо, Gurdeep, за быстрый ответ, но я только что перезагрузил свой collectionview после того, как pickerview сделал изменения в методе selectrow... и все заработало нормально.

CloneCreated 09.04.2019 15:58

Кстати, @gurdeep, не могли бы вы объяснить, почему вы использовали здесь CGPoint и что такое CGPoint tfPosition = [sender convertPoint:CGPointZero toView:self.ouboundCollectionView]; что является отправителем в этой строке?

CloneCreated 09.04.2019 16:07

Да, перезагрузка представления коллекции также будет работать, если у вас есть строка ниже в методе itemForIndexPath:. cell.ssrTextField.text = listOfOutboundSSR[ключ]; Но есть загвоздка в том, что вы перезагружаете всю коллекцию, а изменение происходит только в одной ячейке. В идеале вы должны перезагружать только эту конкретную ячейку. Для этого вам снова нужно знать, какую ячейку перезагружать, поэтому возвращаясь к исходной проблеме. . Что касается вашего второго комментария, я только что отредактировал свой ответ. отправитель на самом деле является текстовым полем :) Я использовал его, чтобы найти, для какой ячейки редактируется текстовое поле.

Gurdeep 09.04.2019 18:35

Да, вы правы, я использовал ваш подход, и он сработал как шарм, и да, я использовал текстовое поле вместо отправителя. Ваше здоровье! и спасибо

CloneCreated 09.04.2019 22:38

- (void)textFieldDidBeginEditing:(UITextField *)textField { CGPoint tfPosition = [textField convertPoint:CGPointZero toView:self.collectionView]; NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:tfPosition]; selectedCell = [self.collectionView cellForItemAtIndexPath: indexPath]; } как это будет работать, если у меня более одного collectionView?

CloneCreated 10.04.2019 09:40

Gurdeep У меня есть две коллекции uiview... как узнать, какое текстовое поле uicollectionview редактируется?

CloneCreated 10.04.2019 10:55

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