1

問題:

クラスにイベント呼び出しを送信するための UIButton を取得できません

最初に試したのは次のとおりです。

ViewerというUIViewControllerを拡張するクラスを作成しました

#import "Viewer.h"
#import "MainScreen.h"

@implementation Viewer

- (void)viewDidLoad
{
    MainScreen* main = [[MainScreen alloc]init: self];
    [main show];

    [super viewDidLoad];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

それから:

  • MainScreen というクラス、2 つの IBOutlets - singlePlayerButton とビューを作成しました
  • Viewer は UIViewController のインスタンスです
  • buttonPressed の戻り値の型は IBAction です

メインスクリーン:

#import "MainScreen.h"
#import "Viewer.h"

@implementation MainScreen
{
    IBOutlet UIButton* singlePlayerButton;
    IBOutlet UIView* view;

    Viewer* viewer;
}

- (id)init:(Viewer*) theViewer
{
    self = [super init];
    viewer = theViewer;
    return self;
}

- (void)show
{
    [[NSBundle mainBundle] loadNibNamed:@"MainScreenLayout" owner:self options:nil];
    [viewer.view addSubview:view];
}

- (IBAction)buttonPressed:(id)sender
{
    NSLog(@"A button was pressed!");
}

@end

次に、というNIBを作成しましたMainScreenLayout.xib

これは次のようになります。

NIB ファイルのスクリーンショット

ご覧のとおり、ボタンは 4 つありますが、接続されているのはシングル プレイヤー ボタンだけです。UIView もビューに接続しています。

ここで、次のようにアクションをシングルプレイヤー ボタンにリンクしました。

アクションをボタンに接続するスクリーンショット

buttonPressedボタンが押されたときに呼び出したいメソッドです。そのため、First Responder を Ctrl キーを押しながらクリックし、横にある円をクリックしてbuttonPressed、Single-Player ボタンの上にドラッグしました。次に、次のダイアログ ウィンドウが表示され、[Touch up Inside] をクリックしました。受信したアクション ウィンドウは次のようになります。

ファーストレスポンダ ウィンドウのスクリーンショット

さて、この時点でうまくいくはずだと思いました。iPhone Simulator で実行し、ボタンを押しました。

私が有能かどうかは疑問の余地がないので、実際にボタンをクリックしている写真を次に示します。

スクリーンショット

私は何の出力も得られませんでした。それから私は自分のコードに行き、メソッドを見ました。これは次のようになります。

メソッドのスクリーンショット

ご覧のとおり、楕円は塗りつぶされていません。これは、メソッドがペアになっていないことを意味します。当然、別の方法でオーバーライドされていると思いました。したがって、メソッドは次のようになります。

- (IBAction)aVerySpecificMethodNameForMyButtonListener:(id)sender
{
    NSLog(@"A button was pressed!");
}

次に、NIB ウィンドウに戻り、Single-Player ボタンのペアリングを解除してから、aVerySpecificMethodNameForMyButtonListener. これは次のようになります。

ばかげたメソッド名のスクリーンショット

その後、もう一度実行しましたが、ボタンを押しても何もありませんでした。次に、コードに戻りました。

スクリーンショット

(ここにフラストレーションを挿入)

この時点で、Xcode とシミュレーターを再起動し、すべてをもう一度調べましたが、それでも機能しませんでした。

これは私が次に試したもので、約 10 億倍簡単に思えます。

- (void)show
{
    [[NSBundle mainBundle] loadNibNamed:@"MainScreenLayout" owner:self options:nil];
    [viewer.view addSubview:view];

    [singlePlayerButton addTarget:self action:@selector(aVerySpecificMethodNameForMyButtonListener:) forControlEvents:UIControlEventTouchUpInside];
}

私のshow方法を上記のものに置き換えました。唯一違うのは最後の行です。メソッドを NIB のシングルプレイヤー ボタンから切り離しました。それから私はそれを実行し、いくつかの出力を得たので一瞬興奮しました。これが私が得たものです:

(lldb) 

いつものように、非常に役立つ出力 C デバッガー。私は、私が間違っていることを見つけようとして、次の数時間をSOに費やしました。無数の例を試しましたが、どれもうまくいきませんでした。

ここで私が間違っていることを誰かが見ていますか?Xcodeが不安定なだけですか?

読んでくれてありがとう!!関連するすべての回答を歓迎します。


アップデート:

また、UIButton の宣言をヘッダー ファイルのプロパティに変更してみました。

#import <Foundation/Foundation.h>
#import "Viewer.h"

@interface MainScreen : NSObject
{
    IBOutlet UIView* view;

    Viewer* viewer;
}

@property (weak, nonatomic) IBOutlet UIButton* singlePlayerButton;

- (id)init:(Viewer*) theViewer;
- (void)show;
- (IBAction)aVerySpecificMethodNameForMyButtonListener:(id)sender;

@end

したがって、準拠するために MainScreen.m で変更したものは次のとおりです。

#import "MainScreen.h"
#import "Viewer.h"

@implementation MainScreen

- (id)init:(Viewer*) theViewer
{
    self = [super init];
    viewer = theViewer;
    return self;
}

@synthesize singlePlayerButton;

- (void)show
{
    [[NSBundle mainBundle] loadNibNamed:@"MainScreenLayout" owner:self options:nil];
    [viewer.view addSubview:view];

    [singlePlayerButton addTarget:self action:@selector(aVerySpecificMethodNameForMyButtonListener:) forControlEvents:UIControlEventTouchUpInside];
}

- (IBAction)aVerySpecificMethodNameForMyButtonListener:(id)sender
{
    NSLog(@"A button was pressed!");
}

@end

MainScreen.m ファイル内に変数宣言がなくなったので、それらをすべてヘッダーに移動しました。singlePlayerButtonとの横の円viewはまだ塗りつぶされていますが、メソッドの横のバブルは塗りつぶされていません。コードを再度実行したところ、同じ出力が得られました。

4

1 に答える 1

1

本当に単なる提案ですが、まだ担当者がいないため、希望を上げて申し訳ありませんが、タッチイベントのスコープは、それが発生するUIView内にのみあると思います。touch up イベントがトリガーされると、UIView のハンドラー (MainScreen クラス) に渡されないため、イベントのリスナー メソッドは呼び出されませんが、インターフェイス ビルダーでそれをボタンにリンクすることができます。私には困惑しているので、私は道を外れている可能性があります。

とにかく、次に進むべきだと思うのは、MainScreen を UIView オブジェクトにして、それがビュー内のボタンのイベント処理に何をするかを確認することです。

于 2012-12-31T02:21:05.117 に答える