问题描述
我的应用程序有两个视图,具体取决于它决定加载哪个视图的方向.但IB不允许我将两个PickerView连接到同一个OUTLET,有没有办法在代码中分配连接,这样当我加载视图时我将连接分配到插座?
或者我应该为每个视图做双重操作吗?
或者我应该将两个视图分成不同的nib文件
请在此帮助我
谢谢
推荐答案
嗯,请记住,IBOutlet只是一种已经以在IB中可见的方式声明的属性.所以第一个问题的答案是肯定的.如有必要,您始终可以在代码中重新分配该属性.
我认为您已经有两个IBOutlet用于您的横向和纵向视图 - 如下所示:
@property(nonatomic,retain)IBOutlet UIView * landscapeView;
@property(非原子,保留)IBOutlet UIView * portraitView;
听起来你在中选择了合适的视图willAnimateRotationToInterfaceOrientation:duration :.
同样,您可以为选择器视图声明两个出口:
@property(非原子,保留)IBOutlet UIPickerView * landscapePickerView;
@property(非原子,保留)IBOutlet UIPickerView * portraitPickerView;
如果你走这条路线,我会声明一个动态属性,它始终返回选择器视图当前定位.
@property(非原子,保留,只读)UIPickerView * pickerView;
您可以像下面这样实现它:
- (UIPickerView *)pickerView {
if(self.landscapeView.superview){
return self.landscapePickerView;
}
else {
返回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中弹簧,意味着所有边距都是灵活的,但宽度和高度不是.