0

UI 要素を取得するために別のクラスを使用するビュー コントローラー (vc1) があります。したがって、vc1 のビューは、Layout というクラスから返された別のビューをサブビューとして設定します。クラス Layout から返されるビューには、UIbutton が含まれています。Layout クラスには、次のコードがあります。

[btn addTarget:self action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside];

次に、同じクラス (レイアウト) で、メソッド button_clicked も宣言しました。

- (void)button_clicked:(id)sender {
    NSLog(@"btn clickd");
}

ただし、ボタンをクリックすると何か問題が発生します。デバッグ エリアにエラー メッセージは表示されませんが、Xcode の状態はよくありません。シミュレーターはフォーカスを失い、Xcode が次の行のファイル (AppDelegate.m だと思います) と共に表示されます。

@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}

緑色で強調表示されます。また、コードには次のメッセージが表示されます。

スレッド 1: EXC_BAD_ACCESS(コード=2、アドレス=0x9)

何が間違っている可能性がありますか?また、ボタンのクリックを vc1 で管理する必要があるのではないかと懸念しているため、vc1 内に配置するのが最善の方法だと思います。そう思いませんか?

4

2 に答える 2

0

コードで設定されたボタンのターゲット -

[btn addTarget:self action:@selector(button_clicked:)   forControlEvents:UIControlEventTouchUpInside];

ボタンをクリックする前に解放される可能性があります。

ビュー コントローラー (vc1) 内のボタン クリックで呼び出されるメソッドを配置する場合は、それを行うことができます。ボタンのターゲットをselfからnilに変更するだけです。

[btn addTarget:nil action:@selector(button_clicked:)   forControlEvents:UIControlEventTouchUpInside];

次に、vc1 に「button_clicked」メソッドを実装します。「button_clicked」は無視できる宣言されていないセレクターであるという警告がレイアウトクラスにある場合があります。

「Layout」クラスで「button_clicked」メソッドを呼び出したい場合は、それを行うことができます。vc1 クラスで strong 属性を持つ Layout クラスのプロパティを宣言します。次に、レイアウト クラスのオブジェクトを作成し、それを使用してプロパティをインスタンス化します。

Layout *propertyName = [[Layout alloc] init];

次に、ビューを次のように返す関数を呼び出します (関数名を getViewFromLayoutClass にします)。

[propertyName getViewFromLayoutClass]

ボタンをクリックすると、Layout クラスのメソッドが呼び出されます。

于 2015-12-29T10:56:47.530 に答える