【问题标题】:Showing a view controller from a parallel window (with the same parent)从并行窗口显示视图控制器(具有相同的父级)
【发布时间】:2015-02-28 18:42:18
【问题描述】:

我试图直接从其兄弟窗口显示 ViewController,树看起来像这样:CalibrationVC Settings VC。 MainVC 在当前上下文中以模态方式呈现其他两个。现在我要做的是单击 SettingsVC 中的一个按钮,这将打开特定设备的 CalibrationVC。我已经设法使用 unwind segues 和来自 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);
}

以及准备转场方法:

- (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 已经呈现。所以总结一下,有没有更好、更优化/合适的方法来做到这一点?

【问题讨论】:

    标签: ios objective-c multithreading


    【解决方案1】:

    如果你不是特别需要放松转场,你可以这样做:

    设置 VC:

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

    代表:

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

    【讨论】:

    • 是的,谢谢,这正是我想要的,清晰而简单。
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多