2

これは質問であり、解決策でもあります。

私は最近、iPad アプリケーションにポップアップとして表示したい UIDatePicker と UILabel だけを含む、.xib を持つ非常にシンプルな UIViewController を iPad アプリケーションに追加しました。

絵コンテ

この .xib をポップアップとして表示するために、関連するすべてのコードを追加しました。エラーや警告はありませんでした。UIViewController クラスこの .xib の「クラス」として設定され、両方のコントロールがこの特定のファイルのIBOutletsにリンクされていることが示されました。

しかし、アプリを実行すると、ポップアップは問題なく表示されますが、これら 2 つのコントロールに関係するものにアクセスしようとしても、何も起こりません。

たとえば、次のコードは、ラベルのテキストを設定して UIDatePicker のモードを変更しようとしましたが、何も起こりませんでした。ブレークポイントを試してみました。コードは実行されていました。コントロールには値がありましたが (nil ではありませんでした)、このコードは何もしませんでした。UILabel のテキストは変更されず、DatePicker は引き続き「日付と時刻」モードになります。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        // Custom initialization
        [self.datePicker addTarget:self action:@selector(LabelChange:) forControlEvents:UIControlEventValueChanged];

        self.lblQuestion.text = @"Is this working...?";
        self.datePicker.datePickerMode = UIDatePickerModeDate;
        self.datePicker.date = [NSDate date];
    }
    return self;
}

最終的に-最終的に-「contentSizeForViewInPopover」を設定するために、1行のコードを追加しました。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        // Without this line of code, the code-behind doesn't communicate
        // with the controls in this .xib
        self.contentSizeForViewInPopover = self.view.bounds.size;

        //  ... etc ...

...そして突然、見事に機能しました。

ここに画像の説明を入力

それで、私の質問は.. なぜですか?

この 1 行のコードは一体何をするのでしょうか。突然、UILabel のテキストを設定し、UIDatePicker コントロールと対話できるようになります... ?

私は XCode の癖やクラッシュには慣れていますが、なぜこれが原因でコードが突然動作するようになったのか、困惑しています。私は、この癖が私の人生の数時間を無駄にしただけであることに安堵しています...そしてその背後にある理由を理解したいと思います.

ところで、これは XCode 4.6.3 を使用しており、iPad 用の iOS 6.1 SDK アプリで実行されています。

4

1 に答える 1

4

ニブがロードされると、コンセントが接続されます。初めてコントローラーのビューにアクセスすると、nib がロードされます。

つまり、イニシャライザでは、すべてのアウトレットが nil です。ただし、 を呼び出すself.viewと、ビューが読み込まれ、アウトレットが接続されます。contentSizeForViewInPopoverまたはbounds.size無関係です。

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    self.view; //this is enough
    ...

これが、そのようなコードをイニシャライザーではなく、代わりに入れるべきである理由ですviewDidLoad

- (void)viewDidLoad {
    [self.datePicker addTarget:self
                        action:@selector(LabelChange:)
              forControlEvents:UIControlEventValueChanged];

    self.lblQuestion.text = @"Is this working...?";
    self.datePicker.datePickerMode = UIDatePickerModeDate;
    self.datePicker.date = [NSDate date];
}
于 2013-07-22T23:13:34.497 に答える