プログラムによる UISwitch の作成
-
19-09-2019 - |
質問
iPhone 開発についてさらに学ぶための終わりのない努力の中で、私は Apple 開発者の Web サイトから入手できるソース コードの一部を試してきました。私が取り組んでいる特定の例は Core Data Books です。 ここ. 。DetailViewController と AddViewController は、xib ファイルがないため、プログラムで作成されます。私の質問は、IB を使用せずにプログラムでビューに項目を追加することについてです。DetailView の特定の書籍に関する詳細情報を含む UISwitch を UITableView の下に置きたいと考えています。どうすればいいでしょうか?これは私がこれまでに試したことです:
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");
}
スイッチがオンのときは常にコンソールはオンを読み取り、オフのときはコンソールはオフを読み取る必要があります。右?それを移動すると、コンソールでオフの状態が繰り返されます。オンでもオフでも、誇示するだけです。いったい私は何を間違っているのでしょうか?助けてください!ありがとう
解決
コンパイラはあなたを助けようとしています。onoff インスタンス変数をオーバーライドしています。 viewDidLoad;
したがって、それは決して設定されません。-フリップでは:メソッドでは、nil コントローラーを参照しています。これを修正するには 2 つの方法があります。
(a) onoff のローカル宣言を削除し、インスタンス変数だけを使用します。
(b) sender 引数を -flip にキャストします。として UISwitch
, にアクセスし、次のようにします。
- (IBAction) flip: (id) sender {
UISwitch *onoff = (UISwitch *) sender;
NSLog(@"%@", onoff.on ? @"On" : @"Off");
}
他のヒント
スティーブ、質問を誤解していたらごめんなさい。実際に作成しましたか? 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];