0

シンプルなケース。単純なUITextFieldの入力を表示して反応するUIViewControllerを作成したいと思います。

  1. xibファイルを含むUIViewControllerを作成しました。
  2. Interface Builderで、ビューとそれを含むUITextFieldを追加しました。
  3. ファイルの所有者は、ロジック「CardViewController」を含む対応するクラス名に設定されます。
  4. ファイル所有者は、ビューとしてのビューを指します。
  5. テキストフィールドは、ファイルの所有者をデリゲートとして使用します。

こんな感じ…

ここに画像の説明を入力してください

ビューは正しく表示されていますが、テキストフィールドをタップするとすぐに、「EXC_BAD_ACCESS...」という例外が発生してアプリケーションがクラッシュします。

代理人の割り当てに問題があると思いますが、問題を見つけるのに問題があります。何か案が?私は何を取りこぼしたか?


さらなる調査結果。このビューコントローラをAppDelegateで直接インスタンス化すると、UITextFieldの委任が実際に機能します。

しかし、最初に「BoardViewController」クラスのインスタンスを作成し、次に「CardViewController」オブジェクトを作成するために実際に行うことを計画しています。この種のネストがあると、委任は失敗します。

参考までに。私のアプリデリゲート:

BoardViewController *bvc = [[BoardViewController alloc] init];
[self.window setRootViewController:bvc];

ボードクラスには、CardViewControllersの作成をトリガーする「追加」ボタンがあります

-(void) addCard:(id)touchEvent{
    NSLog(@"<Board> Add");
    CardViewController *cvc = [[CardViewController alloc]init];
    [self.view addSubview:cvc.view];
}

次に、CardViewControllerは最初に述べたように見え、委任はxibに設定されています。

4

3 に答える 3

0

CardViewControllerが初期化されていないようです。どこに建設すべきだと思いますか?

于 2013-01-06T11:37:57.777 に答える
0

解決策を見つけたようです。CardViewController のビューをサブビューとして追加するだけでなく、ChildViewController としても追加する必要がありました。

親の BoardViewController で

-(void) addCard:(id)touchEvent{
    CardViewController *cvc = [[CardViewController alloc]init];
    [self addChildViewController:cvc];
    [self.view addSubview:cvc.view];
}

その後、デリゲート呼び出しが機能します。わーい。

于 2013-01-06T16:07:49.073 に答える
0

ビューコントローラーを適切に初期化する必要があります。

CardViewController *objCardView = [[CardViewController alloc]initWithNibName:@"CardViewController" bundle:nil];

[self.view addSubview:objCardView.view];

これが機能している場合は、次のことを確認してください。

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

    }
    return self;
}

あなたのクラスのこのメソッドは機能しており、ViewDidLoad を確認してください。

次に、textField デリゲートが適切に実装されていることも確認する必要があります。プロパティで textField を初期化し、接続ファイル所有者を作成します。

ブレーク ポイントを使用してコードをデバッグします。これがお役に立てば幸いです。

于 2013-01-06T12:01:54.797 に答える