Создание UISwitch программно - PullRequest
29 голосов
/ 08 января 2010

В кажущейся непрекращающейся попытке узнать больше о разработке для iphone, я поигрался с некоторыми исходными кодами, доступными на сайте разработчиков apple. Конкретный пример, с которым я работаю, это Core Data Books, найденные здесь . DetailViewController и AddViewController создаются программно, поскольку для них нет файлов XIB. Мой вопрос о программном добавлении вещей в представление без использования IB. Я хочу поместить UISwitch под UITableView, который содержит подробную информацию о конкретной книге в DetailView. Как мне это сделать? Это то, что я пробовал до сих пор:

В AddViewController я настраиваю переключатель UIS:

@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 скрывает переменную экземпляра. Но даже при том, что есть эти доходы, UISwitch всплывает просто отлично, но когда я перемещаю или использую его, не похоже, что он работает полностью. Для моего действия, которое выглядит так:

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

Всякий раз, когда коммутатор включен, консоль должна читать, а когда она выключена, консоль должна считываться. Правильно? Каждый раз, когда я перемещаю его, он просто повторяется в консоли, выключен. Если он включен или выключен, он только показывает. Что в мире я делаю не так? Пожалуйста помоги! Спасибо

Ответы [ 2 ]

29 голосов
/ 08 января 2010

Компилятор пытается вам помочь. Вы переопределяете переменную экземпляра onoff в вашем viewDidLoad;, таким образом, это никогда не будет установлено. В вашем методе -flip: вы ссылаетесь на nil-контроллер. Есть два способа исправить это:

(a) Избавьтесь от локальной декларации onoff и просто используйте переменную вашего экземпляра

(b) Приведите аргумент отправителя к -flip: как UISwitch и получите доступ к этому:

- (IBAction) flip: (id) sender {
    UISwitch *onoff = (UISwitch *) sender;
    NSLog(@"%@", onoff.on ? @"On" : @"Off");
}
16 голосов
/ 08 января 2010

Стив, прости, если я неправильно понял твой вопрос. Вы действительно создали 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];
...