180

私は数日間それをやろうとしていますが、それをやろうとしている人々のメッセージをたくさん読んだ後でも、次の例のように、UITextField私の一部で完全に機能することはまだできません:UITableViewCells

スクリーンショット

フォームは機能していますが、テキストが表示されていません (色を青に設定していますが)、クリックするとキーボードがフィールドに表示され、キーボードイベントを正しく実装できませんでした。Apple の例をいくつか試してみましたが (主UICatalogに、似たようなコントロールがあります)、まだ正しく動作していません。

誰かが私 (およびこのコントロールを実現しようとしているすべての人) を助けて、正常に動作UITextFieldする aの a の簡単な実装を投稿できUITableViewCellますか?

4

12 に答える 12

225

これを試してみてください。私にとって魅力のように機能します(iPhoneデバイスで)。このコードをログイン画面に一度使用しました。テーブル ビューが 2 つのセクションを持つように構成しました。もちろん、セクション条件を取り除くこともできます。

- (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;    
}

結果は次のようになります。

ログインフォーム

于 2010-02-09T16:19:47.780 に答える
47

iOS6/7/8/9 で見栄えの良いソリューションを次に示します

2016 年 6 月 10 日の更新: iOS 9.3.3 でも動作します

ご支援いただきありがとうございます。これは現在、 https: //github.com/fulldecent/FDTextFieldTableViewCell の CocoaPods/Carthage/SPM にあります。

基本的に、在庫を取り、本来あるべき場所にUITableViewCellStyleValue1ホッチキスで留めます。これにより、iOS6/7/8/9、iPhone/iPad、画像/画像なし、アクセサリ/アクセサリなし、ポートレート/ランドスケープ、1x/2x/3x のすべてのシナリオで自動配置が可能になります。UITextFielddetailTextLabel

ここに画像の説明を入力

注: これは、UITableViewCellStyleValue1「単語」という名前のタイプ セルでストーリーボードを使用しています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell = [tableView dequeueReusableCellWithIdentifier:@"word"];
    cell.detailTextLabel.hidden = YES;
    [[cell viewWithTag:3] removeFromSuperview];
    textField = [[UITextField alloc] init];
    textField.tag = 3;
    textField.translatesAutoresizingMaskIntoConstraints = NO;
    [cell.contentView addSubview:textField];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:cell.textLabel attribute:NSLayoutAttributeTrailing multiplier:1 constant:8]];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeTop multiplier:1 constant:8]];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeBottom multiplier:1 constant:-8]];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:cell.detailTextLabel attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]];
    textField.textAlignment = NSTextAlignmentRight;
    textField.delegate = self;
    return cell;
}
于 2014-02-05T23:26:31.490 に答える
23

これが私がこれを達成した方法です:

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];
}

少し冗長に思えるかもしれませんが、うまくいきます!

デリゲートを設定することを忘れないでください!

于 2009-12-31T13:42:28.913 に答える
16

これを試してみてください。スクロールも処理でき、以前に追加したサブビューを削除する手間をかけずにセルを再利用できます。

- (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];
}
于 2010-11-29T13:16:28.853 に答える
16

これは難しいことではありません。テーブルのセルを作成するときに、UITextField オブジェクトをセルのコンテンツ ビューに追加します。

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

UITextField のデリゲートを self (つまり、viewcontroller) として設定します。テキスト フィールドにタグを付けて、デリゲート メソッドで編集されたテキスト フィールドを識別できるようにします。ユーザーがテキスト フィールドをタップすると、キーボードがポップアップするはずです。私はそれをこのように動作させました。それが役に立てば幸い。

于 2009-01-05T08:36:51.693 に答える
9

[cell.contentView bringSubviewToFront:textField]セルが出現するたびに実行するメソッドを呼び出してこれを回避していましたが、この比較的単純な手法を発見しました。

cell.accessoryView = textField;

同じ背景のオーバーペーストの問題はないようで、それ自体で(ある程度)調整されます。また、textLabel は、オーバーフローを回避するために自動的に切り捨てられます。これは便利です。

于 2011-04-22T18:30:29.443 に答える
4

私は同じ問題に遭遇しました。プロパティを設定するcell.textlabel.textと、セルの contentView の前に UILabel が表示されるようです。を設定した後に textView を追加するtextLabel.textか、(それが不可能な場合は) これを呼び出します。

[cell.contentView bringSubviewToFront:textField]
于 2011-02-07T13:24:43.827 に答える
2

UITableView でテキスト フィールドが非表示になり、フォーカスされると行全体が青色に変わるなど、iPad でのこのタスクには本当に苦労しました。

最終的にうまくいったのは、Apple のTable View Programming Guideの「The Technique for Static Row Content」で説明されている手法でした 。ラベルと textField の両方をビューの NIB の UITableViewCell に配置し、そのセルをアウトレットから引き出しcellForRowAtIndexPath:ます。結果のコードは、UICatalog よりもはるかにきれいです。

于 2011-09-11T20:58:47.140 に答える
1

これが正しい方法だと信じている方法です。テストしたところ、Ipad と Iphone で動作します。uitableviewcell をクラス化して、独自の customCells を作成する必要があります。

interfaceBuilderで開始...新しいUIViewcontrollerを作成し、それをcustomCellと呼びます(そこにいる間にxibのボランティアをします)customCellがuitableviewcellのサブクラスであることを確認してください

今すぐすべてのビューを消去し、1 つのビューを作成して個々のセルのサイズにします。そのビューのサブクラスを customcell にします。ここで、他の 2 つのビューを作成します (最初のビューを複製します)。
接続インスペクタに移動し、これらのビューに接続できる 2 つの IBOutlets を見つけます。

-backgroundView -SelectedBackground

これらを複製した最後の 2 つのビューに接続し、心配する必要はありません。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;

}

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

return 75.0;
}
于 2012-11-27T23:04:40.103 に答える