1

UIViewサブクラスがあり、に接続されていxibます。layoutSubviewsメソッドではなく、でのみビューを作成していますxib。いつ使用するか混乱しself.ivarます_ivar。サブクラスtextFieldのasubviewのテキストを設定しようとしました。UIView誰か助けてもらえますか?textfieldからテキストを設定または取得しようとしましたviewController。しかし、私は成功することはできません。これがコードです。

これが私のUIViewカスタムクラスですDateRangeView.m

#import "DateRangeView.h"

@implementation DateRangeView
@synthesize tfStartDate = _tfStartDate;
@synthesize tfEndDate = _tfEndDate;
@synthesize startDate = _startDate;
@synthesize endDate = _endDate;
@synthesize dateFormatter = _dateFormatter;
@synthesize datePicker = _datePicker;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"DateRangeView" owner:self options:nil];
        [self addSubview:[topLevelObjects objectAtIndex:0]];
        [self baseInit];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        [self baseInit];
    }
    return self;

}

- (void)baseInit {
    NSDateFormatter *df = [[NSDateFormatter alloc]init];
    [df setDateStyle:NSDateFormatterMediumStyle];
    _dateFormatter = df;

    _startDate = [NSDate date];
    _endDate = [NSDate date];
}

- (void)awakeFromNib {
    [super awakeFromNib];

    _datePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 200, 320, 216)];
    [_datePicker setDatePickerMode:UIDatePickerModeDate];
    [_datePicker setDate:[NSDate date]];
    _tfStartDate.inputView = _datePicker;
    _tfEndDate.inputView = _datePicker;

    UIToolbar *keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0,self.frame.size.width, 44)]; 

    UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelButtonPressed:)];

    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)];

    [keyboardToolbar setItems:[[NSArray alloc] initWithObjects:cancelBtn, flexibleSpace, doneButton, nil]];

    [keyboardToolbar setTranslucent:YES];
    [keyboardToolbar setTintColor:[UIColor blackColor]];

    [_tfStartDate setInputAccessoryView:keyboardToolbar];
    [_tfEndDate setInputAccessoryView:keyboardToolbar];

    _tfStartDate.text = [_dateFormatter stringFromDate:_startDate];
    _tfEndDate.text = [_dateFormatter stringFromDate:_endDate];

}

- (void)doneButtonPressed:(id)sender {
    if ([_tfStartDate isFirstResponder]) {

        self.startDate = _datePicker.date;
        [_tfStartDate resignFirstResponder];

    }else if ([_tfEndDate isFirstResponder]) {

        self.endDate = _datePicker.date;
        [_tfEndDate resignFirstResponder];
    }
}

- (void)cancelButtonPressed:(id)sender {
    [_tfStartDate resignFirstResponder];
    [_tfEndDate resignFirstResponder];
}

- (void)setStartDate:(NSDate *)startDate {
    _startDate = startDate;
    _tfStartDate.text = [_dateFormatter stringFromDate:_startDate];
}

- (void)setEndDate:(NSDate *)endDate {
    _endDate = endDate;
    _tfEndDate.text = [_dateFormatter stringFromDate:_endDate];
}

ビューコントローラにビューを追加し、テキストフィールドにテキストを割り当ててテキストを取得しようとしたコードは次のとおりです。しかし、私はテキストの設定と取得の両方に成功していません。

rangeView = [[DateRangeView alloc]initWithFrame:CGRectMake(0, 0, 320, 150)];
[self.view addSubview:rangeView];
rangeView.startDate = [NSDate date];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *startDateComponents = [calendar components:NSDayCalendarUnit fromDate:[NSDate date]];
[startDateComponents setDay:5];

NSDate *beginDate = [calendar dateByAddingComponents:startDateComponents toDate:[NSDate date] options:0];
rangeView.endDate = beginDate;

NSLog(@"start %@", rangeView.tfStartDate.text);
NSLog(@"end %@", rangeView.tfEndDate.text);

ログはnullを示しています。どんな助けもいただければ幸いです。UIView私がしていることを理解するために、私だけのコード全体を添付しました。

4

1 に答える 1

0

self.tfStartDateあなたのコードでは、との初期化が見えませんself.tfEndDate

したがって、2 つの可能性があります。

  1. それらは IBOutlets であることを意図しています: 次に、それらが関連するビューにも接続されていることを nib ファイルで確認します。

  2. これらは xib で定義されていません。この場合は、 で初期化するだけviewDidLoadです。

self.ivarvs.の使用に関して_ivar、唯一の違いは、前者が参照カウントを処理することです。後者の場合は、自分で行う必要があります。したがって、この場合、どちらを使用しているかは関係ありません。問題は、サブビューを正しく参照するための初期化にあります。

于 2013-01-06T17:53:57.317 に答える