2015-02-28 2 views
0

Я пытаюсь показать ViewController непосредственно из его окна родства, дерево выглядит так: CalibrationVC < --- MainVC ---> Настройки VC. MainVC представляет два других модально и в текущем контексте. Теперь то, что я хочу сделать, это нажать кнопку в SettingsVC, чтобы открыть CalibrationVC для определенного устройства. Мне удалось сделать это с помощью UNWIND перетекает и делегат от SettingsVC, и это выглядит следующим образом:Отображение контроллера представления из параллельного окна (с тем же родителем)

- (void)showViewForDeviceCalibration 
{ 
    [self performSegueWithIdentifier:@"showCalibrationViewFromSettings" sender:nil]; 
} 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"showCalibrationViewFromSettings"]) 
    { 
     [_delegate calibrateDevice:deviceToConfigure]; 
    } 
} 

Реализация делегат:

-(void)calibrateDevice:(Device *)device 
{ 
    dispatch_block_t autoinitService = 
    ^{ 
     deviceToCalibrateFromSettings = device; 
     [NSThread sleepForTimeInterval:0.2]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self performSegueWithIdentifier:@"showCalibrationViewForDeviceFromSettings" sender:nil]; 
     }); 

    }; 

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), autoinitService); 
} 

И готовиться к методу SEGUE:

- (void)prepareForSegue: (UIStoryboardSegue *)segue sender:(id) sender 
{ 
    if ([segue.identifier isEqualToString:@"showCalibrationViewForDeviceFromSettings"]) 
    { 
     CalibrationViewController *destinationController = (CalibrationViewController*)segue.destinationViewController; 
     NSArray *devicesToCalibrate = [NSArray arrayWithObject:deviceToCalibrateFromSettings]; 
     [destinationController setDevicesToCalibrate: devicesToCalibrate]; 
} 

Это хорошо работает, но есть ли лучший способ сделать это? Меня действительно беспокоит реализация делегата, потому что он использует отдельный поток только для того, чтобы подождать некоторое время, а затем снова использовать основной поток. Я должен был это сделать, потому что без него CalibrationVC не появлялся, говоря, что MainVC уже представляет. Итак, чтобы подвести итог, есть ли лучший, более оптимальный/правильный способ сделать это?

ответ

1

Если специально не нужно раскручивать перетекает, вы могли бы сделать что-то вроде этого:

Настройки VC:

- (void)showViewForDeviceCalibration 
{ 
    [_delegate calibrateDevice:deviceToConfigure]; 
} 

Делегат:

-(void)calibrateDevice:(Device *)device 
{ 
    [self dismissViewControllerAnimated:YES completion:^{ 
     [self performSegueWithIdentifier:@"showCalibrationViewForDeviceFromSettings" sender:nil]; 
    }]; 
} 
+0

Да, спасибо, это именно то, что я искал, ясное и простое. – Rafal