从原型uicollectionviewcell中的文本字段获取数据

我有一个UICollectionViewCell这是原型单元格,我有一个文本框,其中默认情况下在所有这些。 (这是我想要的)。 我希望能够当用户在这些文本字段中input一个值,以便能够检索数据和数据被放入的单元格(可能是该行的编号)。 我已经看到了一些其他相关的问题,但似乎没有为我工作。 有任何想法吗?

@interface ViewController () { NSArray *collections, *numbers; NSMutableArray *selectedItemsArray; UICollectionViewCell *cell; UITextView *text1Field; NSIndexPath *indexPath1; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. collections = [NSArray arrayWithObjects:@"starbucks_coffee.jpg", @"thai_shrimp_cake.jpg", @"vegetable_curry.jpg", @"white_chocolate_donut.jpg", nil]; selectedItemsArray = [NSMutableArray array]; numbers = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return collections.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static NSString *identifier = @"Cell"; cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; UIImageView *imageview = (UIImageView *)[cell viewWithTag:100]; text1Field = (UITextView *)[cell viewWithTag:50]; imageview.image = [UIImage imageNamed:[collections objectAtIndex:indexPath.row]]; collectionView.allowsMultipleSelection = YES; collectionView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bg2.png"]]; return cell; } 

实现委托方法(void)textViewDidChange:(UITextView *)textView 。 您可以使用textView的标签属性来区分哪一个被更改。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"MySpecialCell"; MySpecialCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[MySpecialCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.mySpecialTextView.delegate = self; } cell.mySpecialTextView.tag = indexPath.row; return cell; } - (void)textViewDidChange:(UITextView *)textView int rowOfTextViewThatJustChanged = textView.tag; } 

更新!
这是一个使用关联对象而不是标签的方法。

 static NSString *const kIndexPathKey = @"indexPathKey"; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"MultiSelectCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; UISwitch *switchView = [[UISwitch alloc] init]; [switchView addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged]; cell.accessoryView = switchView; } UISwitch *switchView = (id)cell.accessoryView; [self setIndexPath:indexPath onSwitch:switchView]; switchView.on = [self isIndexPathSelected:indexPath]; id item = [self itemAtIndexPath:indexPath]; cell.textLabel.text = safePerformSelector(item, self.itemDescriptionSelector); return cell; } - (void)switchValueChanged:(UISwitch *)sender { NSIndexPath *indexPath = [self indexPathOfSwitch:sender]; [self setRowSelected:sender.isOn atIndexPath:indexPath]; [self.delegate didSelectItem:[self itemAtIndexPath:indexPath] atIndexPath:indexPath selected:sender.isOn sender:self]; } - (void)setIndexPath:(NSIndexPath *)indexPath onSwitch:(UISwitch *)switchView { [switchView setAssociatedObject:indexPath forKey:kIndexPathKey]; } - (NSIndexPath *)indexPathOfSwitch:(UISwitch *)switchView { return [switchView associatedObjectForKey:kIndexPathKey]; } @implementation NSObject (AssociatedObjects) - (void)setAssociatedObject:(id)object forKey:(NSString *const)key { objc_setAssociatedObject(self, (__bridge const void *)(key), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (id)associatedObjectForKey:(NSString *const)key { return objc_getAssociatedObject(self, (__bridge const void *)(key)); } @end 

好吧,我已经想出了一个同样问题的人的方式。 需要做的是

  1. 让你的collectionView在一个专用的UICollectionViewController
  2. 添加委托方法<UITextFieldDelegate>
  3. 在你的textFieldShouldEndEditing:textField方法中添加下面一行

    NSIndexPath *indexPath = [self.collectionView indexPathForCell:(UICollectionViewCell*)[[textField superview] superview]];

这里发生的事情基本上是你声明一个存储textFieldindexPathNSIndexPath引用。 indexPath将通过indexpath.row发出一个行号。

那么你可以使用这个数据,但是你想:)