2011-03-16 158 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