ios - 在UITableViewCell,有没有UITextField

  显示原文与译文双语对照的内容

我想了几天,和在阅读大量的信息的人试图这么做,我仍然无法完全在我的一些 UITableViewCellsUITextField 工作,就像这个例子:

Screenshot

要么我让表单工作,但文本是不可见的( 虽然我把它的颜色设置为蓝色),当我单击它时,键盘会出现在字段上,并且我无法正确实现键盘事件。 我尝试了一些来自苹果( 主要是 UICatalog,那里有类似的控制)的例子,但它仍然无法正常工作。

有人能帮我( 所有试图实现这个控制的人) 和发布的一个简单实现 UITextFieldUITableViewCell, 没问题?

时间:

试试这个,对我来说是个魅力,( 在iPhone设备上) 。 我曾将这里代码用于登录屏幕一次。 我将表格视图配置为有两个部分。 当然,你可以去掉部分条件。


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (cell == nil) {
 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
 reuseIdentifier:kCellIdentifier] autorelease];
 cell.accessoryType = UITableViewCellAccessoryNone;

 if ([indexPath section] == 0) {
 UITextField *playerTextField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)];
 playerTextField.adjustsFontSizeToFitWidth = YES;
 playerTextField.textColor = [UIColor blackColor];
 if ([indexPath row] == 0) {
 playerTextField.placeholder = @"example@gmail.com";
 playerTextField.keyboardType = UIKeyboardTypeEmailAddress;
 playerTextField.returnKeyType = UIReturnKeyNext;
 }
 else {
 playerTextField.placeholder = @"Required";
 playerTextField.keyboardType = UIKeyboardTypeDefault;
 playerTextField.returnKeyType = UIReturnKeyDone;
 playerTextField.secureTextEntry = YES;
 } 
 playerTextField.backgroundColor = [UIColor whiteColor];
 playerTextField.autocorrectionType = UITextAutocorrectionTypeNo;//no auto correction support
 playerTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;//no auto capitalization support
 playerTextField.textAlignment = UITextAlignmentLeft;
 playerTextField.tag = 0;
//playerTextField.delegate = self;

 playerTextField.clearButtonMode = UITextFieldViewModeNever;//no clear 'x' button to the right
 [playerTextField setEnabled: YES];

 [cell.contentView addSubview:playerTextField];

 [playerTextField release];
 }
}
if ([indexPath section] == 0) {//Email & Password Section
 if ([indexPath row] == 0) {//Email
 cell.textLabel.text = @"Email";
 }
 else {
 cell.textLabel.text = @"Password";
 }
}
else {//Login button section
 cell.textLabel.text = @"Log in";
}
return cell; 
}

结果类似于:

alt text

以下是我实现这里目的的方法:

TextFormCell.h


#import <UIKit/UIKit.h>

#define CellTextFieldWidth 90.0
#define MarginBetweenControls 20.0

@interface TextFormCell : UITableViewCell {
 UITextField *textField;
}

@property (nonatomic, retain) UITextField *textField;

@end

TextFormCell.m


#import"TextFormCell.h"

@implementation TextFormCell

@synthesize textField;

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier {
 if (self = [super initWithReuseIdentifier:reuseIdentifier]) {
//Adding the text field
 textField = [[UITextField alloc] initWithFrame:CGRectZero];
 textField.clearsOnBeginEditing = NO;
 textField.textAlignment = UITextAlignmentRight;
 textField.returnKeyType = UIReturnKeyDone;
 [self.contentView addSubview:textField];
 }
 return self;
}

- (void)dealloc {
 [textField release];
 [super dealloc];
}

#pragma mark -
#pragma mark Laying out subviews

- (void)layoutSubviews {
 CGRect rect = CGRectMake(self.contentView.bounds.size.width - 5.0, 
 12.0, 
 -CellTextFieldWidth, 
 25.0);
 [textField setFrame:rect];
 CGRect rect2 = CGRectMake(MarginBetweenControls,
 12.0,
 self.contentView.bounds.size.width - CellTextFieldWidth - MarginBetweenControls,
 25.0);
 UILabel *theTextLabel = (UILabel *)[self textLabel];
 [theTextLabel setFrame:rect2];
}

它可能有点冗长,但它可以 !

不要忘记设置委托 !

试试这个。它可以处理滚动,你可以重用的细胞没有删除subviews你之前添加的麻烦。


- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section{
 return 10;
} 

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"Cell"];
 if( cell == nil)
 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease]; 

 cell.textLabel.text = [[NSArray arrayWithObjects:@"First",@"Second",@"Third",@"Forth",@"Fifth",@"Sixth",@"Seventh",@"Eighth",@"Nineth",@"Tenth",nil] 
 objectAtIndex:indexPath.row];

 if (indexPath.row % 2) {
 UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 21)];
 textField.placeholder = @"Enter Text";
 textField.text = [inputTexts objectAtIndex:indexPath.row/2];
 textField.tag = indexPath.row/2;
 textField.delegate = self;
 cell.accessoryView = textField;
 [textField release];
 } else
 cell.accessoryView = nil;

 cell.selectionStyle = UITableViewCellSelectionStyleNone;
 return cell; 
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
 [inputTexts replaceObjectAtIndex:textField.tag withObject:textField.text];
 return YES;
}

- (void)viewDidLoad {
 inputTexts = [[NSMutableArray alloc] initWithObjects:@"",@"",@"",@"",@"",nil];
 [super viewDidLoad];
}

这不应该是困难的。 为表格创建单元格时,向单元格视图的内容添加一个UITextField样式对象


UITextField *txtField = [[UITextField alloc] initWithFrame....]
...
[cell.contentView addSubview:txtField]

设置委托的uitextfield自我( IE 你的viewcontroller ) 给标签的文本字段,这样你就可以确定哪些文本框编辑你的委托方法。 当用户点击文本字段时,键盘应该弹出。 我让它像这样工作。 希望有帮助。

我通过调用一个方法来避免这一点 [cell.contentView bringSubviewToFront:textField] 每次出现我的细胞,但后来我发现了这个相对简单的技术:


cell.accessoryView = textField;

似乎并没有相同的background-overpasting问题,它自己本身( 有点) 一致。 另外,textLabel auto-truncates可以避免溢出( 或者下),这很方便。

我遇到了同样的问题。 似乎设置 cell.textlabel.text 属性将UILabel带到单元格的前面。 在设置 textLabel.text 之后添加 textView,或者( 如果不可能的话) 调用:


[cell.contentView bringSubviewToFront:textField]

我真的在这个任务在ipad上,与文本字段出现在uitableview无形,将蓝色的时候,整个行焦点。

为我工作最后所描述的技术在"静态行内容的技术"苹果的表视图编程指南。 I put both label and textField in a UITableViewCell in NIB for view, and pull that cell out via an outlet in cellForRowAtIndexPath: 。 生成的代码比UICatalog简洁得多。

这就是它的完成方式,我相信正确的方法。 它在Ipad和Iphone上运行,我测试过它。 我们要通过分级uitableviewcell创建我们自己的customCells:

在interfaceBuilder中开始。。 创建一个新的UIViewcontroller调用它 customCell ( 当你在那里的时候为xib志愿者) 确保customCell是uitableviewcell的子类

清除所有视图并创建一个视图,使它的成为单个单元格的大小。 使该视图成为子类 customcell 。 现在创建另外两个视图( 复制第一个) 。
转到连接检查器并找到 2 IBOutlets你现在可以连接到这些视图。

-backgroundView -SelectedBackground

连接到刚才刚刚复制的两个视图,不用担心它们。 扩展customCell的第一个视图,在它的内部放置标签和 uitextfield 。 进入 customCell.h 并挂接你的标签和文本页。 将这里视图的高度设置为 75 ( 每个单元格的高度) 所有已经完成。

在 customCell.m 文件中,确保构造函数的外观类似于:


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//Initialization code
 NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 
 self = [nibArray objectAtIndex:0];
}
return self;
}

现在创建一个 UITableViewcontroller,在这个方法中使用customCell类:


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
//lets use our customCell which has a label and textfield already installed for us

customCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
//cell = [[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


 NSArray *topLevelsObjects = [[NSBundle mainBundle] loadNibNamed:@"NewUserCustomCell" owner:nil options:nil];
 for (id currentObject in topLevelsObjects){
 if ([currentObject isKindOfClass:[UITableViewCell class]]){
 cell = (customCell *) currentObject;
 break;
 }
 }

 NSUInteger row = [indexPath row];

switch (row) {
 case 0:
 {

 cell.titleLabel.text = @"First Name";//label we made (uitextfield also available now)

 break;
 }


 }
return cell;

%7D


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

return 75.0;
}

...