[英]Trouble setting UISwitch in FlipsideViewController
我有一個來自標准模板的iPhone實用程序應用程序,因此我有MainViewController
和FlipsideViewController
,它們已初始化並稱為controller.
在controller's
xib中,我有一個名為pathSwitch
的UISwitch
和一個名為locationSelector
的UISegmentedControl
,它們是出口(並已連接!)。當我調用showInfo:(id)sender
方法時,我將執行以下操作:
[EDIT]添加controller...
的界面controller...
[EDIT 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和OFF。 如果我在controller's
viewWillAppear
方法中設置了它們的屬性,它們將顯示正確的設置。
執行此操作時controller
是否未完全加載?
你也許是對的。 最干凈的方法是將一些屬性添加到FlipsideViewController
並進行設置。 然后,讓viewWillAppear
使用這些屬性設置實際的開關。
這還將把FlipsideViewController
的UI布局問題放到它們所屬的位置,即放在FlipsideViewController
而不是在任何其他可能使用它的控制器中。 (即,如果您決定不使用開關而是使用某種按鈕,則可以更改FlipsideViewController
而不必查看其他代碼)
編輯
一些澄清。 嘗試在相關位置使用以下FlipsideViewController
屬性添加到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];
這將a)解決您的問題,b)分開您對用戶界面的關注。 如果您決定更改FlipsideViewController
的布局,則無需更改FlipsideViewController
以外的任何代碼。
還有其他方法可以實現此目的,例如,讓viewDidLoad
從其委托中獲取值,如下所示:
[self.pathSwitch setOn:[delegate pathSwitch]];
視情況而定可能更好。 一般來說,我總是會選擇最后一種方法,因為它可以防止不同視圖控制器之間的同步問題。
我不確定但不應該這樣
@property (nonatomic, retain) IBOutlet UISegmentedControl *locationSelector;
@property (nonatomic, retain) IBOutlet UISwitch *pathSwitch;
代替
@property (nonatomic, assign) IBOutlet UISegmentedControl *locationSelector;
@property (nonatomic, assign) IBOutlet UISwitch *pathSwitch;;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.