30

iPhone の開発についてさらに学ぶための尽きることのない努力の中で、私はリンゴの開発者の Web サイトから入手できるソース コードのいくつかを試してみました。私が取り組んでいる特定の例は、コア データ ブックです。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 は問題なくポップアップしますが、動かしたり使用したりすると、完全に機能しているようには見えません。次のような私のアクションの場合:

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

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

4

2 に答える 2

31

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

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

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

- (IBAction) flip: (id) sender {
    UISwitch *onoff = (UISwitch *) sender;
    NSLog(@"%@", onoff.on ? @"On" : @"Off");
}
于 2010-01-08T16:29:16.907 に答える
16

スティーブ、あなたの質問を誤解してすみません。実際にを作成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];
于 2010-01-08T10:52:17.187 に答える