問題:
クラスにイベント呼び出しを送信するための 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
これは次のようになります。
ご覧のとおり、ボタンは 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
はまだ塗りつぶされていますが、メソッドの横のバブルは塗りつぶされていません。コードを再度実行したところ、同じ出力が得られました。