通常我有标签和一些文本字段是IBOutlets,如果有人点击按钮,我可以轻松地阅读这些文本字段的文本值
self.myTextfield1.text;
但现在我有一个UITableView
的自定义表格单元格。在这些单元格中,我有一个标签和一个文本字段。在加载时,我在cellForRowAtIndexPath
:
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCell *cell = (MyCell*)[theTableView dequeueReusableCellWithIdentifier:@"MyCell"];
if (!cell) {
[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];
cell = self.myCell;
self.myCell = nil;
}
switch (indexPath.section) {
case 0:
switch (indexPath.row) {
case 0:
cell.myCellLabel.text = @"Label1";
cell.myCellTextField.text = @"...";
break;
case 1:
cell.myCellLabel.text = @"Label2";
cell.myCellTextField.text = @"...";
break;
// and so on...
default:
break;
}
break;
case 1:
switch (indexPath.row) {
case 0:
cell.myCellLabel.text = @"Label1_1";
cell.myCellTextField.text = @"...";
break;
// and so on...
}
default:
break;
}
return cell;
}
因此,如果有人点击该按钮,则无法使用self.mytextfield1.text
访问字段的文本值。我怎样才能获得字段的价值?我知道标签的哪个部分和哪个行应该是哪个值。因此,如果我可以结合使用部分和行号来获取文本字段的值,那么这将非常棒。
也许有人知道如何解决这个问题?
最诚挚的问候,蒂姆。
答案 0 :(得分:2)
如果将文本字段的值存储在数组中,则数组的索引将与该行相同。你甚至可以有多个数组:
cellLabelArray
cellTextFieldArray
这不是非常优雅,但会解决问题。然后你将摆脱你的switch语句并做这样的事情:
cell.myCellLabel.text = [cellLabelArray objectAtIndex:indexPath:row];
cell.myTextField.text = [cellTextFieldArray objectAtIndex:indexPath:row];
使用数组作为UITableView的数据源是一种常见的模式。
我不知道按下按钮会发生什么,但如果您需要更改标签的值,您只需更改数组中的值,然后向tableview发送reloadData
消息。
答案 1 :(得分:1)
这里的问题是表单元格被重用,所以你不能从单元格中“拉”输入的值,而是让单元格使用UITextFieldDelegate“输入”输入的值。
在自定义UITableViewCell中,为section和row添加变量,将单元格设置为textfield委托,并使用自定义委托协议将生成的textfield事件转发到带有附加section和row的viewcontroller。然后让viewcontroller将传入的数据写入与UITableView数据源读取数据相同的位置。
这是一个没有部分但带有'type'的示例:
#import <Foundation/Foundation.h>
@protocol ArticleTextFieldViewCellDelegate
-(void)didUpdateTextField:(int)index type:(int)type withText:(NSString*)text;
@end
@interface ArticleTextFieldViewCell : UITableViewCell <UITextFieldDelegate> {
IBOutlet UITextField* valueTextField;
id<ArticleTextFieldViewCellDelegate> delegate;
int index;
int type;
}
@property (nonatomic, retain) IBOutlet UITextField* valueTextField;
@property (nonatomic, retain) id<ArticleTextFieldViewCellDelegate> delegate;
@property (nonatomic, assign) int index;
@property (nonatomic, assign) int type;
@end
和实施
#import "ArticleTextFieldViewCell.h"
#import <UIKit/UIKit.h>
@implementation ArticleTextFieldViewCell
@synthesize type, valueTextField, delegate, index;
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if(delegate) {
[delegate didUpdateTextField:index type:type withText:[textField.text stringByReplacingCharactersInRange:range withString:string]];
}
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
// optionally trigger delegate method here
}
@end
如果每个单元格有多个文本字段,请使用更多委托方法或“类型”之类的其他变量。