1

У меня есть пользовательская библиотека (devinross/tapkulibrary), которая реализует сегментированные элементы управления. Этот сегментированный элемент управления помещается в подпункт основного вида. Теперь, когда я меняю элемент управления на сегментированные элементы управления, я перехожу к новому диспетчеру просмотра и перерисовываю сегментированные элементы управления в том же месте. Но это вызывает некоторые проблемы во время анимации в некоторых случаях.iOS: Сохранение вида постоянное или передача представления между различными ViewControllers

Возможно ли, что я могу присвоить сегментированное свойство управления нового контроллера представления текущему свойству и тем самым использовать один и тот же сегментированный элемент с различными контроллерами.

// 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; 
    } 
} 

Для case 1: в switch разделе First.m файла, я также попытался следующие, но не повезло:

[controller.segmentedView addSubView:self.multiSwitch]; 

отметить также, что я не могу использовать подвидов и показать их, когда элементы управления Географическая изменены. Мне нужно изменить контроллеры представлений.

EDIT: Видео показывая, что работает, а что нет (здесь 3 секции есть)

рабочий: https://www.youtube.com/watch?v=lI368z9ntfM

проблема: https://www.youtube.com/watch?v=oTU6tIq5ZW4

+0

Какие проблемы с анимацией вы видите? – mbm29414

+0

Поскольку я ранее сохранял отдельные сегментированные элементы управления, я вручную выбирал индекс в viewDidLoad of Second.h, когда пользователь касается определенного сегментированного элемента управления. Но когда пользователь перетаскивает (или проверяет) по сегментированному управлению, он отображает анимацию дважды, поскольку есть такое же событие прослушивания UIControlEventValueChanged. – meteors

+0

Итак, у вас есть 2 объекта 'UISegmentedControl', но только 1 прослушиватель? Не могли бы вы сделать, чтобы каждый сегментированный элемент управления имел свой собственный слушатель (т. Е. Контроллер отображения, который отображает его)? – mbm29414

ответ

1

Ok, так что я не могу понять некоторые части того, как и почему вы хотите делать то, что хотите. Из того, что я понял, вы хотите, чтобы скрыть контроллер «First» и показать контроллер в «Второй» вместо этого, но при этом, вы не хотите, чтобы освободить «Multiswitch» контроль. Я также предполагаю, что вы хотите полностью выбросить «Сначала» и заново создать его, если необходимо.

Чтобы быть правдивым, мне не очень нравится ваше решение, но я также мало знаю о том, что вы пытаетесь сделать, поэтому я просто попытаюсь дать ответ, основанный на вышеперечисленных предположениях.

Добавьте следующие строки перед созданием второго контроллера в 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];

Вы теперь установлены. Вы также не забудьте добавить 'Второй' в качестве цели для 'multiswitch' control. В 'Second.m', метод 'viewDidLoad', добавьте:

[self.multiswitch addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged];

Конечно, вы должны реализовать 'changedSegmentedControl:' в 'Второй' также.

Вы бы лучше в повторном использовании «First» вместо «Второй» (Инициировать контроллера «First» вместо «Второй» так, что у вас уже есть функциональные возможности для «мультипереключателя «контроль»). Если вам нужна дополнительная функциональность, измените «Второй 'для того, чтобы наследовать' Первый 'и добавьте дополнительный код, в котором вы нуждаетесь.

+1

Спасибо за удаление цели и добавление цели снова помогли. – meteors