2

わかりました。これは以前に尋ねられたことがあることを知っています。これを機能させるためにさまざまな方法を試しましたが、何らかの理由で機能しません。文字列をラベルのテキストプロパティに保存しようとしています。ラベルはtableVC、コンテナビュー内で呼び出される子ビューコントローラViewControllerにあり、UIDatePickerの値datePickerが変更されたときに、IBActionのparentViewControllerから設定しています。私が試してみました:

tableVC *tVC = [[tableVC alloc] init];
tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date];

また、プロパティ@property (strong, nonatomic) tableVC *tVC;を作成してから次のことを実行してみました。

_tVC = [tableVC alloc] init];
_tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date];

しかし、それも機能しません。ところで、私は持ってい#import "tableVC"ます。私はただの初心者の間違いを犯していると思っているので、複雑なデリゲートやプロトコルの方法は必要ありません。[formatter stringFromDate:self.datePicker.date]また、を使用して、datePickerから適切なnil以外のフォーマットされた値を返すことを確認しましたNSLog(@"%@", [formatter stringFromDate:self.datePicker.date]);

編集

ここに、ファイル全体とともにもう少し情報があります。このテーブルは、ストーリーボードで定義された静的テーブルです。これが問題の原因だと思いましたが、ラベルが1つしかないtableVCサブクラスの代わりにを使用してUIViewControllerも機能しませんでした。問題は、子ビューコントローラのプロパティをどのように設定するかにあると思います。prepareForSequeただし、他のプロジェクトでこのメソッドを使用する場合、この問題は発生しません。宛先コントローラーのプロパティの値は問題なく設定できますが、宛先コントローラーではないビューコントローラーのプロパティの値は設定できません。これら2つの問題は一致していると思います。すべての接続はストーリーボードを介して適切に行われました。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

ViewController.m

#import "ViewController.h"
#import "tableVC.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIView *containerView;
@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;

- (IBAction)changedDatePickerSelection:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    tableVC *tVC = [[tableVC alloc] init];
    [self addChildViewController:tVC];
    [tVC didMoveToParentViewController:self];

    NSLog(@"parent");
}

- (IBAction)changedDatePickerSelection:(id)sender
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.timeZone = [NSTimeZone defaultTimeZone];
    formatter.timeStyle = NSDateFormatterShortStyle;
    formatter.dateStyle = NSDateFormatterMediumStyle;

    tableVC *tVC = (tableVC *)self.childViewControllers.lastObject;
    tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date];

    _testLabel.text = [formatter stringFromDate:self.datePicker.date];

    NSLog(@"%@", [formatter stringFromDate:_datePicker.date]);
    NSLog(@"%@", tVC.timeLabel.text);
}

@end

tableVC.h

#import <UIKit/UIKit.h>

@interface tableVC : UITableViewController

@property (weak, nonatomic) IBOutlet UILabel *timeLabel;

@end

tableVC.m

#import "tableVC.h"
#import "ViewController.h"

@interface tableVC ()

@property (weak, nonatomic) IBOutlet UITextField *titleTextField;
@property (weak, nonatomic) IBOutlet UISwitch *onOffSwitch;
@property (weak, nonatomic) IBOutlet UIButton *saveButton;

- (IBAction)saveAlarm;

@end

@implementation tableVC

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.timeZone = [NSTimeZone defaultTimeZone];
    formatter.timeStyle = NSDateFormatterShortStyle;

    _timeLabel.text = [formatter stringFromDate:[NSDate date]];
    NSLog(@"%@", _timeLabel.text);
}

- (BOOL)textFieldShouldReturn:(UITextField*)aTextField
{
    [aTextField resignFirstResponder];
    return YES;
}

- (IBAction)saveAlarm
{
    // do something
}

@end

また、これが私の2つの画像で、の選択が変更されたときにfromがどのように更新されるかを示していますが、 testLabelfromはどのように更新されなかったかを示しています。最初の画像は選択の変更前で、2番目の画像は後です。わかりやすくするために、は3番目のセルの右側にあるラベルであり、はのすぐ上にあるラベルです。ViewControllerdatePickertimeLabeltableVCtimeLabeltestLabeldatePicker

http://cl.ly/image/2Q301v0d2m00

http://cl.ly/image/0223183E1t2m

助けてくれてありがとう。

4

2 に答える 2

4

子ViewControllerが1つしかない場合は、次のように実行できます。

tableVC *tVC = (tableVC *)self.childViewControllers.lastObject;
tVC.timeLabel.text = ....;

複数の子がある場合は、どれが必要かを判断し、lastObjectの代わりにobjectAtIndex:を使用する必要があります。

編集後:これは私がしたことです。日付ピッカーを変更するたびに新しいフォーマッターを割り当てる必要がないため、いくつかのプロパティを追加し、いくつかのコードをviewDidLoadに移動しました。

#import "ViewController.h"
#import "TableVC.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIView *containerView;
@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;
@property (strong,nonatomic) NSDateFormatter *formatter;
@property (strong,nonatomic) TableVC *tVC;

- (IBAction)changedDatePickerSelection:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.formatter = [[NSDateFormatter alloc] init];
    self.formatter.timeZone = [NSTimeZone defaultTimeZone];
    self.formatter.timeStyle = NSDateFormatterShortStyle;
    self.formatter.dateStyle = NSDateFormatterMediumStyle;

    self.tVC = (TableVC *)self.childViewControllers.lastObject;
}

- (IBAction)changedDatePickerSelection:(id)sender {

    self.tVC.timeLabel.text = [self.formatter stringFromDate:self.datePicker.date];
    _testLabel.text = [self.formatter stringFromDate:self.datePicker.date];
}

TableVCでは、名前を大文字にする以外は何も変更していません(実際には、クラス名を大文字にする必要があります)。

于 2012-11-21T23:06:39.213 に答える
0

ビューコントローラの新しいインスタンスを作成しているalloc/initを実行するたびに。おそらくアウトレットを使用して、すでに画面に表示されている既存のインスタンスへのポインターが必要です(これがInterface Builderで設定されている場合)。

于 2012-11-21T21:02:01.663 に答える