iPhone - 获取UITextField的值,这些值放在自定义的UITableViewCell中

时间:2011-02-11 18:44:37

标签: iphone objective-c

通常我有标签和一些文本字段是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访问字段的文本值。我怎样才能获得字段的价值?我知道标签的哪个部分和哪个行应该是哪个值。因此,如果我可以结合使用部分和行号来获取文本字段的值,那么这将非常棒。

也许有人知道如何解决这个问题?

最诚挚的问候,蒂姆。

2 个答案:

答案 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

如果每个单元格有多个文本字段,请使用更多委托方法或“类型”之类的其他变量。