【问题标题】:Trouble setting UISwitch in FlipsideViewController在 FlipsideViewController 中设置 UISwitch 时遇到问题
【发布时间】:2011-07-16 17:01:18
【问题描述】:

我有一个来自标准模板的 iPhone 实用程序应用程序,所以我有 MainViewControllerFlipsideViewController 被初始化并称为 controller.controller's xib 中我有一个 UISwitch 称为 pathSwitch 和一个 @ 987654327@ 称为 locationSelector 是网点(并且已连接!)当我调用 showInfo:(id)sender 方法时,我执行以下操作:

[编辑] 添加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's viewWillAppear 方法中设置它们的属性,它们会显示正确的设置。

controller 在我执行此操作时是否未完全加载?

【问题讨论】:

    标签: iphone ios properties uiviewcontroller uicontrol


    【解决方案1】:

    你可能是对的。最干净的方法是向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]];
    

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

    【讨论】:

    • 谢谢 - 虽然不知道你的意思......我将 UISwitchUISegmentedControl 声明为属性(和 IBOutlets)。我将添加controller的接口...
    • 第一种方法有效 - 谢谢。我还是不明白为什么,如果我做了switch和segmented control属性,一旦视图控制器被实例化,我就不能直接设置它们了。似乎是一种复杂的做事方式。我更喜欢第二种方法,但有很多关于 -locationMode getter not defined in &lt;id&gt;delegate 或类似的错误(记不清了)
    • 这是因为您显然没有告诉编译器 delegate 指向哪种对象。快速解决方法是将其从id 更改为RootViewController(我猜?),但正确的方法是定义您自己的协议,并将委托声明为id&lt;MyVeryOwnProtocol&gt; delegate;。但现在只需尝试使编译器静音,一旦完成,您就可以寻求进一步的改进。
    【解决方案2】:

    我不确定,但不应该这样

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

    而不是

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

    【讨论】:

    • 很好 - 我从委托属性声明中复制了 @property... 的东西,模板中的 assign. 有问题。 +1
    猜你喜欢
    • 1970-01-01
    • 2019-11-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多