Iphone 双视图多个UIPickerViews单出口

Iphone 双视图多个UIPickerViews单出口,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,我的应用程序有两个视图,这取决于它决定加载哪个视图的方向。但是IB不允许我将两个PickerView连接到同一个插座,有没有办法在代码中分配连接,以便在加载视图时将连接分配到插座 或者我应该为每个视图都做两次吗 还是应该将两个视图拆分为不同的nib文件 请在这方面帮助我 谢谢我最近在我的应用程序中应用了这个概念。在这种情况下,您可以为触摸时显示选择器的每个按钮指定一个int。 假设您有两个按钮btn1和btn2。让他们的触摸动作是btn1Action和btn2Action。您还可以为两个选择器都

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

或者我应该为每个视图都做两次吗

还是应该将两个视图拆分为不同的nib文件

请在这方面帮助我


谢谢

我最近在我的应用程序中应用了这个概念。在这种情况下,您可以为触摸时显示选择器的每个按钮指定一个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
    }
    } 

希望这有帮助。

我最近在我的应用程序中应用了这个概念。在这种情况下,您可以为触摸时显示选择器的每个按钮指定一个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
    }
    } 

希望这能有所帮助。

请记住,IBOutlet只是一个属性,它的声明方式使它在IB中可见。因此,第一个问题的答案是肯定的。如有必要,您始终可以在代码中重新指定该属性

我想您已经有了两个用于风景和人像视图的IBO插座——类似于这样:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];
听起来你在
WillAnimateRotationInterfaceOrientation:duration:
中选择了合适的视图

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

@property (nonatomic, retain) IBOutlet UIPickerView *landscapePickerView;
@property (nonatomic, retain) IBOutlet UIPickerView *portraitPickerView;
如果你这样做,我会声明一个动态属性,它总是返回当前方向的选择器视图

@property (nonatomic, retain, readonly) UIPickerView *pickerView;
您可以这样实现它,而不是合成此属性:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];
但是,如果您有一个或两个以上的子视图,那么像这样的并行属性会使控制器变得混乱,这可能是一件痛苦的事情。在这种情况下,我会考虑制作一个UIVIEW的自定义子类,称为类似PickerContainer的子类,它为PACKEVIEW和您需要访问的任何其他子视图都有分支。然后在IB中,您可以将横向视图和纵向视图的类更改为PickerContainer,并且可以将每个picker直接连接到其superview。然后,您可以在控制器中创建一个动态属性,如下所示:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];
之后,您可以通过其容器访问当前方向的pickerView,如下所示:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];

编辑:以下是我如何在我的一个项目上实现WillAnimateRotationInterfaceOrientation: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中没有配置支柱或弹簧,这意味着所有的边距都是灵活的,但宽度和高度都不是。请记住,IBOutlet只是一个属性,它的声明方式使它在IB中可见。因此,您的第一个问题的答案是肯定的。如有必要,您始终可以在代码中重新指定该属性

我想您已经有了两个用于风景和人像视图的IBO插座——类似于这样:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];
听起来你在
WillAnimateRotationInterfaceOrientation:duration:
中选择了合适的视图

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

@property (nonatomic, retain) IBOutlet UIPickerView *landscapePickerView;
@property (nonatomic, retain) IBOutlet UIPickerView *portraitPickerView;
如果你这样做,我会声明一个动态属性,它总是返回当前方向的选择器视图

@property (nonatomic, retain, readonly) UIPickerView *pickerView;
您可以这样实现它,而不是合成此属性:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];
但是,如果您有一个或两个以上的子视图,那么像这样的并行属性会使控制器变得混乱,这可能是一件痛苦的事情。在这种情况下,我会考虑制作一个UIVIEW的自定义子类,称为类似PickerContainer的子类,它为PACKEVIEW和您需要访问的任何其他子视图都有分支。然后在IB中,您可以将横向视图和纵向视图的类更改为PickerContainer,并且可以将每个picker直接连接到其superview。然后,您可以在控制器中创建一个动态属性,如下所示:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];
之后,您可以通过其容器访问当前方向的pickerView,如下所示:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}
[self.pickerContainer.pickerView reloadAllComponents];

编辑:以下是我如何在我的一个项目上实现WillAnimateRotationInterfaceOrientation: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中没有配置撑杆或弹簧,这意味着所有的边距都是灵活的,但宽度和高度却不灵活。

我按照您的建议做了。但现在,当我想加载此视图时,它会冻结,然后在一段时间后,它会在我的shouldAutorotateToInterfaceOrientation中给我一个异常EXC_BAD_访问权限。我在那里使用的代码是:-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){self.view=Landscape;}if(uiInterfaceOrientationSportRait(self.interfaceOrientation)){.view=portraintView;}返回YES;}不要在
shouldAutorotateToInterfaceOrientation:
中交换视图。该方法除了返回YES之外不应执行任何操作。相反,交换
-(void)中的视图将旋转到InterfaceOrientation:(UIInterfaceOrientation)到InterfaceOrientation持续时间:(NSTimeInterval)持续时间
,并根据其
到InterfaceOrientation
参数设置条件。抱歉。。。实际上,我是想告诉您交换
-(void)WillAnimateRotationInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration中的视图。我搞混了。我将编辑上面的答案。
-(void)将旋转到InterfaceOrientation:(UIInterfaceOrientation)到InterfaceOrientation‌​电离