我的应用程序有两个视图,具体取决于它决定加载哪个视图的方向。但IB不允许我将两个PickerView连接到同一个OUTLET,有没有办法在代码中分配连接,这样当我加载视图时,我将连接分配给插座?
或者我应该为每个视图做两倍的事情吗?
或者我应该将两个视图分成不同的nib文件
请在此帮助我
由于
答案 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
}
}
希望这有帮助。