2011-03-16 161 views
1

设置UISwitch我从标准模板的iPhone实用的应用程序,所以我有MainViewControllerFlipsideViewController是被初始化,并呼吁controller.controller's厦门国际银行我有一个UISwitch称为pathSwitch和一个名为locationSelector是出口UISegmentedControl(和迷上了)当我喊了showInfo:(id)sender方法,我做到以下几点:!麻烦FlipsideViewController

[编辑]添加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和OFF。如果我在controller'sviewWillAppear方法中设置它们的属性,它们确实显示正确的设置。

controller没有完全加载,当我这样做或什么?

回答

2

你可能是对的。最简洁的方法是将一些属性添加到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]; 

这会)解决您的问题和b)分离的有关用户INTERF关注:开关量高手。如果您决定更改FlipsideViewController的布局,则不需要更改FlipsideViewController以外的任何代码。

还有其他方法可以达到这个目的,例如,通过让您的viewDidLoad获取来自其委托的价值,这将是这样的:

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

这可能会更好,根据您的情况。一般来说,我总是会更喜欢最后一种方法,因为它可以防止不同视图控制器之间的同步问题。

+0

感谢 - 不知道你的意思,但...我宣布'UISwitch'和'UISegmentedControl'作为属性(和IBOutlets)。我将添加'controller'的界面... – Steve 2011-03-17 04:00:54

+0

@Steve看到我更新的答案。 – mvds 2011-03-17 09:37:58

+0

第一种方法奏效 - 谢谢。我仍然不明白为什么,如果我已经完成了切换和分段控制属性,一旦视图控制器被实例化后,我就不能直接设置它们。看起来像一个令人费解的做事方式。我更喜欢第二种方法,但得到了很多有关'-locationMode getter没有在委托中定义的错误或者其他一些错误(不能准确记得) – Steve 2011-03-17 15:49:49

1

我不知道,但不应该这样被

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

,而不是

@property (nonatomic, assign) IBOutlet UISegmentedControl *locationSelector; 
@property (nonatomic, assign) IBOutlet UISwitch *pathSwitch;; 
+0

良好的捕获 - 我从委托属性声明中复制了'@property ...'东西,它是模板中的'assign.'。 +1 – Steve 2011-03-17 15:06:40