两个视图多个UIPickerViews单个插座

时间:2011-07-15 08:23:29

标签: iphone objective-c ios ipad

我的应用程序有两个视图,具体取决于它决定加载哪个视图的方向。但IB不允许我将两个PickerView连接到同一个OUTLET,有没有办法在代码中分配连接,这样当我加载视图时,我将连接分配给插座?

或者我应该为每个视图做两倍的事情吗?

或者我应该将两个视图分成不同的nib文件

请在此帮助我

由于

2 个答案:

答案 0 :(得分:5)

嗯,请记住,IBOutlet只是一种声明的属性,使其在IB中可见。所以第一个问题的答案是肯定的。如有必要,您始终可以在代码中重新分配该属性。

我认为你已经有两个IBOutlets用于你的风景和肖像视图 - 像这样:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;

听起来你正在willAnimateRotationToInterfaceOrientation:duration:中选择合适的视图。

同样,您可以为选择器视图声明两个出口:

@property (nonatomic, retain) IBOutlet UIPickerView *landscapePickerView;
@property (nonatomic, retain) IBOutlet UIPickerView *portraitPickerView;

如果你走这条路,我会声明一个动态属性,它总是返回当前方向的选择器视图。

@property (nonatomic, retain, readonly) UIPickerView *pickerView;

您可以像这样实现它,而不是合成此属性:

- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}

但是,如果您有多个或两个子视图,那么使用这样的并行属性会让您的控制器变得混乱。在这种情况下,我会考虑制作一个UIView的自定义子类,称为PickerContainer,它有pickerView和你需要访问的任何其他子视图的插座。然后在IB中,您可以将景观和纵向视图的类更改为PickerContainer,并且可以将每个选取器直接连接到其超级视图。然后在你的控制器中你可以创建一个这样的动态属性:

@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}

然后您可以通过其容器访问pickerView以获取当前方向,如下所示:

[self.pickerContainer.pickerView reloadAllComponents];

编辑:以下是我在其中一个项目中实施willAnimateRotationToInterfaceOrientation:duration:的方法:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) {
        if (self.landscapeView.superview) [self.landscapeView removeFromSuperview];
        self.portraitView.center = CGPointMake(self.view.bounds.size.width / 2,
                                               self.view.bounds.size.height / 2);
        [self.view addSubview:self.portraitView];
    }
    else {
        if (self.portraitView.superview) [self.portraitView removeFromSuperview];
        self.landscapeView.center = CGPointMake(self.view.bounds.size.width / 2,
                                                self.view.bounds.size.height / 2);
        [self.view addSubview:self.landscapeView];
    }
}

我的横向和纵向视图在IB中没有支柱或弹簧配置,这意味着所有边距都是灵活的,但宽度和高度不是。

答案 1 :(得分:-1)

我最近在我的应用程序中应用了这个概念。在这种情况下,您可以做的是为每个按钮分配一个 int ,以显示触摸时的选择器。
假设您有两个按钮 btn1和btn2 。让他们的触摸操作是 btn1Action btn2Action 。您也可以为两个选择器都设置一个工具栏。将选取器和工具栏的可见性设置为隐藏在xib中。

-(void)btn1Action:(id)sender
{
picker.setHidden = NO;
toolbar.setHidden = NO;
iPicker = 1;          // Declared globally
}  

-(void)btn2Action:(id)sender
{
picker.setHidden = NO;
toolbar.setHidden = NO;
iPicker = 2;          // Declared globally
}  

-(void)toolbarAction:(id)sender
{
picker.setHidden = YES;
toolbar.setHidden = YES;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{



     if(iPicker==1)
    {
      return 10;
    }
     if(iPicker == 2)
    {
        return 8;
    }


}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{

    return 1;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)iComponent
{

     if(iPicker==1)
    {
   // Your code

   }
    else if(iPicker == 2)
    {
        // Your code
    }


}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)iComponent
{

    else if(iPicker == 1)
    {
         // Your code

    }
    else if (iPicker == 2)
    {
        // Your code
    }
    } 

希望这有帮助。