web-dev-qa-db-ja.com

プログラムによるUISwitchの作成

Iphone開発についてさらに学ぶために一見決して終わりのない努力の中で、私はリンゴ開発者のウェブサイトから入手可能なソースコードのいくつかで遊んでいます。私が取り組んでいる特定の例は、Core Data Booksで、 here が見つかりました。 DetailViewControllerとAddViewControllerは、それらのxibファイルがないため、プログラムで作成されます。私の質問は、IBを使用せずにプログラムでビューに物事を追加することです。 DetailViewの特定の本に関する詳細情報を含むUITableViewの下にUISwitchを配置します。どうすればいいですか?これは私がこれまでに試したことです:

AddViewControllerで、UISwitchをセットアップします。

@interface AddViewController : DetailViewController {
id <AddViewControllerDelegate> delegate;
UISwitch *onoff;

 }

@property (nonatomic, assign) id <AddViewControllerDelegate> delegate;
@property (nonatomic, retain) IBOutlet UISwitch *onoff;

IBActionもセットアップします。

- (IBAction)flip:(id)sender;

次に、AddViewController.mファイルで合成しますが、何も起こりません。スイッチをセットアップし、それを行うだけで、セットアップしたIBActionからスイッチの動作を制御できます。これは恥ずかしいほど簡単ですが、わかりません。だから、どんな助けも感謝します!ありがとう

編集1

そのため、次のようにviewDidLoadで指示されたとおりにコードを実装しました。

   - (void)viewDidLoad {

[super viewDidLoad];    
  UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectZero];
[onoff addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged];
// Set the desired frame location of onoff here
[self.view addSubview: onoff];

そして、 'onoff'のローカル宣言がインスタンス変数を隠すという2つの警告をスローします。しかし、それらの収益があったとしても、UISwitchはうまく表示されますが、UISwitchを移動したり使用したりしても、完全に機能しているようには見えません。次のような私の行動に対して:

- (IBAction)flip:(id)sender {
if (onoff.on) NSLog(@"On");  
else  NSLog(@"Off");  
 }

スイッチがオンのときはいつでも、コンソールがオンになり、オフのときはコンソールがオフになります。正しい?私がそれを動かすときはいつでも、それはコンソールでオフに繰り返されます。オンの場合、またはオフの場合、オフのみが表示されます。私は間違って何をしているのですか?助けてください!ありがとう

29
Steve

コンパイラはあなたを助けようとしています。 viewDidLoad;のonoffインスタンス変数をオーバーライドしているため、設定されません。 -flip:メソッドでは、nilコントローラーを参照しています。これを修正するには2つの方法があります。

(a)onoffのローカル宣言を取り除き、インスタンス変数を使用します

(b)sender引数を-flip:にUISwitchとしてキャストし、それにアクセスします:

- (IBAction) flip: (id) sender {
    UISwitch *onoff = (UISwitch *) sender;
    NSLog(@"%@", onoff.on ? @"On" : @"Off");
}
29
Ben Gottlieb

スティーブ、あなたの質問を誤解してすみません。実際にUISwitchを作成し、ビュー階層に追加しましたか?コントローラーの-loadViewまたは-viewDidLoad実装には、次のようなコードが必要です。

// Use the ivar here
onoff = [[UISwitch alloc] initWithFrame: CGRectZero];
[onoff addTarget: self action: @selector(flip:) forControlEvents: UIControlEventValueChanged];
// Set the desired frame location of onoff here
[self.view addSubview: onoff];
[onoff release];
16
Costique