1

ストーリーボードを使用して静的UITableViewを作成しました。テーブルビューの各行にはテキストフィールドが含まれており、各行に識別子を付けました。テキストフィールドの1つは、日付を入力するために使用されます。このテキストフィールドが選択されているときにUIDatePickerを表示したいと思います。これを実現するために、テキストフィールドのinputviewをUIDatePickerに設定しようとしています。この特定のUITableViewCellでUITextFieldを取得するのに苦労しています。だからここに私が行く方向があります:

  -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    const NSString *birthDateCellIdentifier = @"BirthDateCell";
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString * cellIdentifier = [cell reuseIdentifier];
    if(cellIdentifier isEqualToString:birthDateCellIdentifier){
        /*this is the cell we're after so get pointer to cell's textfield*/
        //set textfield's inputview to UIDatePicker

    }


}

これは正しいアプローチですか?もしそうなら、どうすればこのセルのテキストフィールドを見つけることができますか?

ありがとう!

4

4 に答える 4

2

のプロパティをとしてindexPath設定するためにを使用できます。inputViewUITextFieldUIDatePicker

このコードスニペットはあなたを助けるかもしれません...

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"Identifier";
    UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }

    UITextField *textField = [[[UITextField alloc] initWithFrame:CGRectMake(10, 10, 200, 20)] autorelease];
    textField.textColor = [UIColor darkTextColor];
    textField.tag = indexPath.row;
    textField.delegate = self;
    [cell.contentView addSubview:textField];

    if (indexPath.row ==0) {
        // Setting Datepicker as a inputView to the textfield on first ell
        UIDatePicker *datePicker = [[[UIDatePicker alloc] init] autorelease];
        [datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];
        textField.inputView = datePicker;
    }else if(indexPath.row == 1) { // Set the Number pad for the textfield on second cell
        textField.keyboardType = UIKeyboardTypeNumberPad;
    }

    return cell;
}


// DatePicker selector
-(void)dateChanged:(id)sender
{
    UIDatePicker *picker = (UIDatePicker *)sender;
    NSDate *date =picker.date;
    NSLog(@"selected date: %@", date);
}



// TextField Delegate methods
-(void)textFieldDidBeginEditing:(UITextField *)textField
{

}
于 2012-08-02T05:52:34.533 に答える
1

いいえ、そうではありません。セルごとに異なる再利用識別子を使用すると、テーブルwievはセルを再キューイングできないため、メモリを浪費します。tag代わりにプロパティを使用してください。

セルを見つけた場合は、そのセルにプロパティとしてテキストフィールドを追加する必要があります。これが、セルにアクセスするための最もクリーンな方法です。

于 2012-08-01T22:48:41.947 に答える
0

DateCellという名前のApple製のサンプルコードを知っていますか?

image0

image1

image2

コードはここにあり、実行するだけです。

http://developer.apple.com/library/ios/#samplecode/DateCell/Introduction/Intro.html

于 2012-08-01T23:11:32.093 に答える
0

UITableViewがこの特定の問題に対して不適切な選択である可能性を検討しましたか?

考えてみてください。これらの「セル」はそれぞれ、外観と動作が異なり、異なる目的を果たしているように見えます。動的データバインディングを必要としない固定数のセルがあります。

私があなたなら、入力フィールドごとにカスタムビューを作成し、UIScrollViewにすべてを配置します。

このアプローチに固執していても、問題があります。UITableViewCellsには​​UITextFieldプロパティがないため、それらにアクセスすることはできません。次のようなクラスを作成するだけです。

@interface DatePickerView : UIView <UITextFieldDelegate>

@property (nonatomic, retain) UITextField *textField;
@property (nonatomic, retain) UIDatePicker *datePicker;

@end

これで、すべてのロジックがDatePickerViewクラスに含まれます。選択したテキストフィールドを気にすることなく、UITextFieldDelegateメソッドを実装して入力を処理できます。DatePickerViewの実装では、次のことができます。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    // Show the UIDatePicker.
}

これにより、よりクリーンでより適切に封じ込められたデザインが得られます。

于 2012-08-02T00:52:53.400 に答える