2011-01-23 6 views
1

これは既に説明されているかもしれませんが、私はその質問を見つけることができません。iPhone:連絡先アドレスセルに似たカスタムテーブルビューセルを作成する方法

住所を表形式で表示/編集する必要があります。 iPhones連絡先アプリのアドレスセルを見ると、アドレスの表示と編集の両方に1つのセルが使用されているようです。

私は最初に4つのカスタムセルを使ってアドレスを編集していたと考えましたが、アドレスタイプフィールドが4行に及ぶのを見ることができませんでした。これは、UItextFieldsのカスタムアレンジメントを持つ単一のテーブルビューセルで行われたと考えました。

現在、私はこのパスを下っています。私が現時点で固まっているのは、細胞間の灰色の線を扱うことです。私はもともとUItextFieldボーダーをオンにしましたが、実際にはそれほど良く見えませんでした。だから私はカスタム図面を検討しています。しかし、それは細胞の上に描画されないようです。

リンゴがどのようにこのアドレスセルを構成しているか誰にも分かりますか?

おかげ

答えて

0

私は何かの作業を持っているが、私はそのことがよく組み込まれている場合はわかりません。私は基本的にUITextFieldsをアドレスの個々のフィールドに保持するUIViewを作成しました。私はデータを管理し、連絡先のフィールドと同じようにフィールド間に灰色の線を描画するためのカスタムコントローラを作成しました。

このカスタムUIViewをUITableViewセルに追加しました。 drawRect:の描画がUITableViewCellの境界内にとどまるため、これを行うのが推奨されます。 UITableViewセルクラスのdrawRect:を使用した私の実験では、セルではなくUITableViewの背景に線が引かれていました。

これは基本的には機能しますが、好きではないことが1つあります。灰色の線をUITableViewCellの境界まで広げるには、私が配置したUIViewがまったく同じサイズで、drawRectで描画されたすべての描画がUITableViewCellの端に右に広がるようにする必要がありました。

しかし、不透明な背景を使用すると、上に描画されているため、セルの角が丸くなります。だから私は透明な背景を使用しなければならなかった。パフォーマンスの理由から不透明な背景が推奨されるので、実際にこのコントロールを正しく構築しているかどうかはわかりません。幸いなことに、画面上に2または3以上は表示されません。

1

テーブルビュー内の各セルの間に線を入れたい場合は、 'grouped'スタイルを使用します - Interface BuilderのAttributes InspectorのTable Viewタブを参照してください。各グループのメンバーには、それらの間に行があります。

プログラムでUIViewを追加する代わりに、UITableViewCellsを使用することを検討しましたか?このようなXIBには、ラベルとテキストフィールド+垂直ラインを簡単に追加できます。 UITableView対応方法

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    PersonDetailCellViewController *cell = (PersonDetailCellViewController*)[aTableView dequeueReusableCellWithIdentifier:CELL_KEY_VALUE_ID]; 

    if(cell == nil) { 
     NSArray* topLevelObjects = [[NSBundle mainBundle]loadNibNamed:@"PersonDetailCellView" owner:nil options:nil]; 

     for(id currentObject in topLevelObjects) { 
      if([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = (PersonDetailCellViewController*)currentObject; 

       cell.valueTextField.backgroundColor = [UIColor clearColor]; 
       cell.valueTextField.borderStyle = UITextBorderStyleNone; 
       cell.selectionStyle = UITableViewCellSelectionStyleGray; 

       if([Language sharedLanguage].rightToLeft) { 
        // set the alignment right because we are flipping the whole available text field, not just the area which actually has text 
        cell.keyLabel.textAlignment = UITextAlignmentRight; 
        cell.valueTextField.textAlignment = UITextAlignmentLeft; 

        // flip cell contents 
        cell.contentView.layer.transform = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f); 
        // flip text back so that readable 
        cell.keyLabel.layer.transform = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f); 
        cell.valueTextField.layer.transform = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f); 
       } 

       cell.selectionStyle = UITableViewCellSelectionStyleGray; 

       break; 
      } 
     } 
    } 

    cell.keyLabel.text = [keys objectAtIndex:indexPath.section]; 
    cell.valueTextField.placeholder = [hints objectAtIndex:indexPath.section]; 
    cell.valueTextField.delegate = cell; 

    if(indexPath.section == 0) { 
     cell.valueTextField.text = self.name; 
    } else if(indexPath.section == 1) { 
     cell.valueTextField.text = self.mobile; 
    } else if(indexPath.section == 2) { 
     cell.valueTextField.text = self.home; 
    } 

    if(indexPath.section == 1) { 
     cell.valueTextField.keyboardType = UIKeyboardTypePhonePad; 
    } else { 
     cell.valueTextField.keyboardType = UIKeyboardTypeDefault; 
    } 

    // open keyboard 
    if(indexPath.section == 0) { 
     [cell.valueTextField becomeFirstResponder]; 
    } else { 
     [cell.valueTextField resignFirstResponder]; 
    } 

    cell.delegate = self; 
    cell.index = indexPath.section; 

    return cell; 
} 

敬具、トーマスと

@protocol PersonDetailCellViewControllerDelegate 

-(void)didUpdateTextField:(int)index withText:(NSString*)text; 

@end 


@interface PersonDetailCellViewController : UITableViewCell <UITextFieldDelegate> { 

    IBOutlet UILabel* keyLabel; 
    IBOutlet UITextField* valueTextField; 

    int index; 
    id<PersonDetailCellViewControllerDelegate> delegate; 

} 

@property (nonatomic, retain) IBOutlet UILabel* keyLabel; 
@property (nonatomic, retain) IBOutlet UITextField* valueTextField; 
@property (nonatomic, retain) id<PersonDetailCellViewControllerDelegate> delegate; 
@property (nonatomic, assign) int index; 

@end 

@implementation PersonDetailCellViewController 

@synthesize keyLabel, valueTextField, delegate, index; 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
if(delegate) { 
    [delegate didUpdateTextField:index withText:[textField.text stringByReplacingCharactersInRange:range withString:string]]; 
} 
return YES; 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField { 
    return YES; 
} 
- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    return YES; 
} 

@end 

:これは、次のコードで私のために本当によく働きます。

+0

THanks Thomas。私はすでにグループ化されたセルを使用しています。私は連絡先のアドレスセルが動作する方法をエミュレートしようとしています。連絡先アドレスで再生すると、1つのセルが使用されていることが示唆されます。プラス - 連絡先の編集と同様に、私は各行に複数のフィールドを使用しています。 – drekka

2

以下の操作を行います。

  • -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPathメソッドを実装し、あなたが
  • を選ぶの数にcell.detailsTextLabelnumberOfLinesプロパティを設定し、あなたのセル
  • ためUITableViewCellStyleValue2スタイルを使用し、これを使用して計算高さを返します式:44.0f + (numberOfLines - 1) * 19.0f

これはIのどこかで読んでいますしかし、ソースを覚えていない。ちょうど今日これを試してみると、完璧に動作します。

+0

ありがとう。私がアドレスの読み取り専用の表示をフォーマットしているときは、本当に役に立ちます。それは私に問題を与える編集モードの表示です:-) – drekka

関連する問題