我有一个实现分段控件的自定义库(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文件的case 1:部分中的switch,我也尝试了以下操作,但很不幸:
[controller.segmentedView addSubView:self.multiSwitch];

另请注意,更改分段控件后,我将无法使用子视图并显示它们。我必须更改视图控制器。

编辑:视频显示什么在工作,什么不在(这里有3个部分)

工作:https://www.youtube.com/watch?v=lI368z9ntfM

问题:https://www.youtube.com/watch?v=oTU6tIq5ZW4

最佳答案

好的,所以我无法真正理解您想做的事情以及为什么要做的某些部分。
据我了解,您想隐藏' First '控制器,而显示' Second '控制器,但是这样做,您不想释放' multiswitch '控件。我还假设您想完全丢弃' First '并在必要时重新创建它。

说实话,我真的不喜欢您的解决方案,但是我也不太了解您要做什么,因此,我只会根据上述假设给出一个答案。

在创建之前,添加以下行:第二个控制器,位于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 '控制器,以便您已经具有“多开关”控件的功能)。如果您需要其他功能,请更改“ Second ”以继承“ First ”并添加所需的额外代码。

关于ios - iOS:保持 View 恒定或在各个ViewController之间传递 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28068144/

10-13 04:07