Я хотел заполнить ячейки 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;
}
Вам нужно будет создать свойство в контроллере, т. е. 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, не могли бы вы объяснить, почему вы использовали здесь CGPoint и что такое CGPoint tfPosition = [sender convertPoint:CGPointZero toView:self.ouboundCollectionView]; что является отправителем в этой строке?
Да, перезагрузка представления коллекции также будет работать, если у вас есть строка ниже в методе itemForIndexPath:. cell.ssrTextField.text = listOfOutboundSSR[ключ]; Но есть загвоздка в том, что вы перезагружаете всю коллекцию, а изменение происходит только в одной ячейке. В идеале вы должны перезагружать только эту конкретную ячейку. Для этого вам снова нужно знать, какую ячейку перезагружать, поэтому возвращаясь к исходной проблеме. . Что касается вашего второго комментария, я только что отредактировал свой ответ. отправитель на самом деле является текстовым полем :) Я использовал его, чтобы найти, для какой ячейки редактируется текстовое поле.
Да, вы правы, я использовал ваш подход, и он сработал как шарм, и да, я использовал текстовое поле вместо отправителя. Ваше здоровье! и спасибо
- (void)textFieldDidBeginEditing:(UITextField *)textField { CGPoint tfPosition = [textField convertPoint:CGPointZero toView:self.collectionView]; NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:tfPosition]; selectedCell = [self.collectionView cellForItemAtIndexPath: indexPath]; } как это будет работать, если у меня более одного collectionView?
Gurdeep У меня есть две коллекции uiview... как узнать, какое текстовое поле uicollectionview редактируется?
спасибо, Gurdeep, за быстрый ответ, но я только что перезагрузил свой collectionview после того, как pickerview сделал изменения в методе selectrow... и все заработало нормально.