iOS: 保持 View 不变或在各种 ViewController 之间传递视图
iOS: Keeping a View constant or passing a view between various ViewControllers
我有一个实现分段控件的自定义库(devinross/tapkulibrary)。此分段控件放置在主视图的子视图中。现在,当我更改分段控件上的控件时,我会更改为新的 viewcontroller 并在完全相同的位置重新绘制分段控件。但在某些情况下,这会导致我在动画期间出现一些问题。
我是否可以将新视图控制器的分段控件 属性 分配给当前 属性,从而在各种视图控制器上使用相同的分段。
// First.h
@property (weak, nonatomic) IBOutlet UIView *segmentedView;
@property (nonatomic, strong) TKMultiSwitch *multiswitch;
// First.m
- (void)viewDidLoad {
//multiSwitch initializations
[self.multiswitch addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
[self.segmentedView addSubview:self.multiswitch];
}
-(void) changedSegmentedControl:(id)sender {
switch(sender.indexOfSelectedItem)
{
case 1:
Second *controller = (Second*)[self.storyboard instantiateViewControllerWithIdentifier:@"secondvc"];
controller.multiswitch = self.multiswitch;
break;
}
}
// Second.h
@property (weak, nonatomic) IBOutlet UIView *segmentedView;
@property (nonatomic, strong) TKMultiSwitch *multiswitch;
// Second.m
- (void)viewDidLoad {
[self.multiswitch addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
[self.segmentedView addSubview:self.multiswitch];
}
-(void) changedSegmentedControl:(id)sender {
switch(sender.indexOfSelectedItem)
{
case 0:
First *controller = (First*)[self.storyboard instantiateViewControllerWithIdentifier:@"firstvc"];
controller.multiswitch = self.multiswitch;
break;
}
}
对于 First.m 文件的 switch
部分中的 case 1:
,我也尝试了以下但不幸的是:
[controller.segmentedView addSubView:self.multiSwitch];
另请注意,当分段控件更改时,我无法使用子视图并显示它们。我必须更改视图控制器。
编辑:显示有效和无效的视频(这里有 3 个部分)
好的,所以我无法真正理解您想要做的事情的方式和原因的某些部分。
据我了解,您想隐藏“First”控制器并改为显示“Second”控制器,但在这样做时,您不会' 想要释放 'multiswitch' 控制。我还假设您想完全丢弃 'First' 并在必要时重新创建它。
说实话,我不是很喜欢你的解决方案,但我也不太了解你想做什么,所以我会尝试根据上述假设给出答案。
在创建 Second 控制器之前,在 changedSegmentedControl 中添加以下行:.
// Remove 'self' as target. You don't want to receive signals in 'First' anymore, because once it will get released you will end up with a crash.
[self.multiswitch removeTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
// Remove the segmented control from it's superview. It will be added in the 'Second' controller view hierarchy.
[self.multiswitch removeFromSuperview];
你已经准备好了。您也不能忘记添加“Second”作为“multiswitch”控件的目标。
在'Second.m',方法'viewDidLoad'中,添加:
[self.multiswitch addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
当然,您还必须在“Second”中实现“changedSegmentedControl:”。
你最好重用'First'而不是'Second'(启动'First ' 控制器而不是 'Second' 这样您就已经拥有了 'multiswitch' 控件的功能)。如果您需要额外的功能,请更改“Second”以继承“First”并添加您需要的额外代码。
我有一个实现分段控件的自定义库(devinross/tapkulibrary)。此分段控件放置在主视图的子视图中。现在,当我更改分段控件上的控件时,我会更改为新的 viewcontroller 并在完全相同的位置重新绘制分段控件。但在某些情况下,这会导致我在动画期间出现一些问题。
我是否可以将新视图控制器的分段控件 属性 分配给当前 属性,从而在各种视图控制器上使用相同的分段。
// First.h
@property (weak, nonatomic) IBOutlet UIView *segmentedView;
@property (nonatomic, strong) TKMultiSwitch *multiswitch;
// First.m
- (void)viewDidLoad {
//multiSwitch initializations
[self.multiswitch addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
[self.segmentedView addSubview:self.multiswitch];
}
-(void) changedSegmentedControl:(id)sender {
switch(sender.indexOfSelectedItem)
{
case 1:
Second *controller = (Second*)[self.storyboard instantiateViewControllerWithIdentifier:@"secondvc"];
controller.multiswitch = self.multiswitch;
break;
}
}
// Second.h
@property (weak, nonatomic) IBOutlet UIView *segmentedView;
@property (nonatomic, strong) TKMultiSwitch *multiswitch;
// Second.m
- (void)viewDidLoad {
[self.multiswitch addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
[self.segmentedView addSubview:self.multiswitch];
}
-(void) changedSegmentedControl:(id)sender {
switch(sender.indexOfSelectedItem)
{
case 0:
First *controller = (First*)[self.storyboard instantiateViewControllerWithIdentifier:@"firstvc"];
controller.multiswitch = self.multiswitch;
break;
}
}
对于 First.m 文件的 switch
部分中的 case 1:
,我也尝试了以下但不幸的是:
[controller.segmentedView addSubView:self.multiSwitch];
另请注意,当分段控件更改时,我无法使用子视图并显示它们。我必须更改视图控制器。
编辑:显示有效和无效的视频(这里有 3 个部分)
好的,所以我无法真正理解您想要做的事情的方式和原因的某些部分。 据我了解,您想隐藏“First”控制器并改为显示“Second”控制器,但在这样做时,您不会' 想要释放 'multiswitch' 控制。我还假设您想完全丢弃 'First' 并在必要时重新创建它。
说实话,我不是很喜欢你的解决方案,但我也不太了解你想做什么,所以我会尝试根据上述假设给出答案。
在创建 Second 控制器之前,在 changedSegmentedControl 中添加以下行:.
// Remove 'self' as target. You don't want to receive signals in 'First' anymore, because once it will get released you will end up with a crash.
[self.multiswitch removeTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
// Remove the segmented control from it's superview. It will be added in the 'Second' controller view hierarchy.
[self.multiswitch removeFromSuperview];
你已经准备好了。您也不能忘记添加“Second”作为“multiswitch”控件的目标。 在'Second.m',方法'viewDidLoad'中,添加:
[self.multiswitch addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];
当然,您还必须在“Second”中实现“changedSegmentedControl:”。
你最好重用'First'而不是'Second'(启动'First ' 控制器而不是 'Second' 这样您就已经拥有了 'multiswitch' 控件的功能)。如果您需要额外的功能,请更改“Second”以继承“First”并添加您需要的额外代码。