簡體   English   中英

無法在FlipsideViewController中設置UISwitch

[英]Trouble setting UISwitch in FlipsideViewController

我有一個來自標准模板的iPhone實用程序應用程序,因此我有MainViewControllerFlipsideViewController ,它們已初始化並稱為controller. controller's xib中,我有一個名為pathSwitchUISwitch和一個名為locationSelectorUISegmentedControl ,它們是出口(並已連接!)。當我調用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

然后,在FlipsideViewControllerviewDidLoad ,放置開關值的實際處理:

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM