Проблемы с настройкой UISwitch во FlipsideViewController - PullRequest
1 голос
/ 16 марта 2011

У меня есть приложение-утилита для iPhone из стандартного шаблона, поэтому у меня есть MainViewController и FlipsideViewController, которые инициализируются и называются controller. В controller's xib У меня есть UISwitch с именем pathSwitch и UISegmentedControl называется locationSelector, которые являются выходами (и подключены!) Когда я вызываю метод showInfo:(id)sender, я делаю следующее:

[ПРАВКА] Добавление интерфейса controller... [ПРАВКА 2]Обновлен интерфейс для отображения добавленных свойств

- (IBAction)showInfo:(id)sender {    
    ALog(@"method begin...");
    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
    DLog(@">sun path visible = %@, setting flip side controller switch", sunPathIsVisible ? @"YES" : @"NO");
    // deleted -> [controller.pathSwitch setOn:sunPathIsVisible];
    controller.sunPathIsVisible = sunPathIsVisible; // added this
    DLog(@">location mode is %d, setting flip side controller segment index to %d - 1 = %d", locationMode, locationMode, locationMode - 1);
    // deleted -> controller.locationSelector.selectedSegmentIndex = locationMode - 1;
    controller.delegate = self;
    controller.locationMode = locationMode; // added this
    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:controller animated:YES];
    [controller release];
}

@interface FlipsideViewController : UIViewController {
    id <FlipsideViewControllerDelegate> delegate;
    int locationMode; // added this
    UISegmentedControl *locationSelector;
    BOOL sunPathIsVisible;
    UISwitch *pathSwitch;
}

@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;
@property int locationMode; // added this
@property (nonatomic, retain) IBOutlet UISegmentedControl *locationSelector;
@property BOOL sunPathIsVisible; // added this
@property (nonatomic, retain) IBOutlet UISwitch *pathSwitch;;

- (IBAction)done:(id)sender;
- (IBAction)cancel:(id)sender;

@end

// There's also the `protocol` stuff, but I left that out here...

Проблема состоит в том, что элементы управления не принимают свои значения и всегда показывают сегмент 0 и ВЫКЛ.Если я устанавливаю их свойства в методе controller's viewWillAppear, они показывают правильную настройку.

Не загружается ли controller полностью, когда я делаю это или что-то еще?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Вы, вероятно, правы.Самый простой способ - добавить некоторые свойства в FlipsideViewController и установить их.Затем позвольте viewWillAppear установить фактические переключатели, используя эти свойства.

Это также поставит проблемы макета интерфейса пользователя FlipsideViewController там, где они принадлежат, а именно в FlipsideViewController, а не в любом другом контроллере, который может когда-либо использоватьЭто.(т.е. если вы когда-нибудь решите не использовать переключатель, а какую-то кнопку, вы можете изменить FlipsideViewController, не обращая внимания на другой код)

edit

Некоторые уточнения.Попробуйте добавить свойства к FlipsideViewController с этими строками в соответствующих местах:

BOOL switchState;
NSInteger locationMode;

@property (nonatomic,assign) BOOL switchState;
@property (nonatomic,assign) NSInteger locationMode;

@synthesize switchState;
@synthesize locationMode;

Тогда в вашем текущем -(IBAction)showInfo:(id)sender вы можете сказать:

FlipsideViewController *controller = [[FlipsideViewController alloc]
                                         initWithNibName:@"FlipsideView" bundle:nil];
controller.switchState = sunPathIsVisible;
controller.locationMode = locationMode;
controller.delegate = self;
// etc etc

Затем, в FlipsideViewController, в viewDidLoad укажите фактическое значение переключателя:

[self.pathSwitch setOn:self.sunPathIsVisible];
[self.locationSelector setSelectedSegmentIndex:self.locationMode];

Это а) решит вашу проблему и б) разделит ваши опасения относительно пользовательского интерфейса.Если вы решите изменить макет FlipsideViewController, нет необходимости изменять какой-либо код, кроме FlipsideViewController.

. Существуют и другие способы достижения этого, например, с помощью viewDidLoad.получите значение из его делегата, которое будет выглядеть так:

[self.pathSwitch setOn:[delegate pathSwitch]];

Что может быть лучше, в зависимости от вашей ситуации.Вообще говоря, я всегда предпочел бы этот последний подход, так как он предотвращает проблемы синхронизации между вашими различными контроллерами представления.

1 голос
/ 17 марта 2011

Я не уверен, но не должно ли это быть

@property (nonatomic, retain) IBOutlet UISegmentedControl *locationSelector;
@property (nonatomic, retain) IBOutlet UISwitch *pathSwitch;

вместо

@property (nonatomic, assign) IBOutlet UISegmentedControl *locationSelector;
@property (nonatomic, assign) IBOutlet UISwitch *pathSwitch;;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...