我有一个来自标准模板的iPhone实用程序应用程序,因此我有被初始化并称为ojit_code的MainViewController
和FlipsideViewController
。在controller.
xib中,我有一个名为controller's
的UISwitch
和一个名为pathSwitch
的UISegmentedControl
,它们是插座(并已连接!)。 locationSelector
方法,我执行以下操作:
[编辑]添加showInfo:(id)sender
的界面
[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...
controller's
方法设置其属性,则它们的确显示正确的设置。执行此操作时,
viewWillAppear
是否未完全加载? 最佳答案
你也许是对的。最干净的方法是将一些属性添加到FlipsideViewController
,然后进行设置。然后,让viewWillAppear
使用这些属性设置实际的开关。
这还将把FlipsideViewController
的UI布局问题放在它们所属的位置,即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]];
根据您的情况,可能会更好。一般来说,我总是会选择最后一种方法,因为它可以防止不同视图控制器之间的同步问题。
关于iphone - 无法在FlipsideViewController中设置UISwitch,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5327700/