Ios 在UIActionSheetDelegate方法中无法显示子视图

Ios 在UIActionSheetDelegate方法中无法显示子视图,ios,objective-c,delegates,uiactionsheet,Ios,Objective C,Delegates,Uiactionsheet,我有以下代码(假设)当由操作表按钮触发时,它会显示一个子视图: - (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { if (buttonIndex ==0) { [self.view addSubview:self.customView]; // // heavy lifting of

我有以下代码(假设)当由操作表按钮触发时,它会显示一个子视图:

- (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{    
    if (buttonIndex ==0) {
        [self.view addSubview:self.customView];
        //
        // heavy lifting of method here
        //
        // self.customView removes itself from superview before actionSheet:dismissWithButtonIndex: finishes
    }
}
完成所有“繁重工作”后,子视图将自己从视图继承人中移除(在操作表委托方法完成之前)

唉!!我发现子视图从未显示在屏幕上。 事实上,如果我阻止添加的子视图自行关闭并设置断点,我会发现它确实会显示,但只有在UIActionSheet委托方法完成后才会显示

起初,我认为这是因为子视图出现在
actionSheet:clickedbutonnatindex:
UIActionSheet委托方法中-导致actionSheet阻止视图的显示

看看其他可用的方法,
actionSheet:diddismisswithbuttonnindex:
似乎可以解决我的问题,因为
这个方法在动画结束后被调用,视图被隐藏(根据Apple文档)。还是不走运


在方法完成之前,您是否想过如何显示此子视图。

您似乎正在使用相同的方法添加和删除子视图(actionSheet:didDismissButtonIndex:)。这意味着操作是在主运行循环的同一周期中完成的。请注意,视图渲染仅在操作结束时完成,这意味着“addSubview”被“removeFromSuperview”覆盖,从而导致根本不渲染视图

您可以做的是在取消操作表之前但单击按钮之后调用的委托方法中“addSubview”,然后在取消操作表之后调用的委托方法中调用“removeFromSuperview”:


-(void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex {
    [self.view addSubview:self.subviewToAdd];
    self.subviewToAdd.center=CGPointMake(160,100);
}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    [self.subviewToAdd removeFromSuperview];
}
在本例中,您将看到视图正在闪烁,因为添加/删除操作在动作表动画时间内受到限制。您可以通过更改actionSheet:didDismissWithButtonIndex:将其设置为在较长时间后删除,方法是添加一个小延迟:

-(无效)操作表:(UIActionSheet*)操作表未使用buttonIndex(集成器)buttonIndex解除{
[self.subview添加性能选择器:@selector(removeFromSuperview),对象:nil afterDelay:1.0];
//[self.subview从SuperView添加或删除];
}

您似乎在用相同的方法添加和删除子视图(操作表:didDismissButtonIndex:)。这意味着操作是在主运行循环的同一周期中完成的。请注意,视图渲染仅在操作结束时完成,这意味着“addSubview”被“removeFromSuperview”覆盖,从而导致根本不渲染视图

您可以做的是在取消操作表之前但单击按钮之后调用的委托方法中“addSubview”,然后在取消操作表之后调用的委托方法中调用“removeFromSuperview”:


-(void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex {
    [self.view addSubview:self.subviewToAdd];
    self.subviewToAdd.center=CGPointMake(160,100);
}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    [self.subviewToAdd removeFromSuperview];
}
在本例中,您将看到视图正在闪烁,因为添加/删除操作在动作表动画时间内受到限制。您可以通过更改actionSheet:didDismissWithButtonIndex:将其设置为在较长时间后删除,方法是添加一个小延迟:

-(无效)操作表:(UIActionSheet*)操作表未使用buttonIndex(集成器)buttonIndex解除{
[self.subview添加性能选择器:@selector(removeFromSuperview),对象:nil afterDelay:1.0];
//[self.subview从SuperView添加或删除];
}

谢谢!既然您解释了这一切都发生在同一个运行循环中,那么就有意义了——本质上是相互抵消的。谢谢你的意见,谢谢!既然您解释了这一切都发生在同一个运行循环中,那么就有意义了——本质上是相互抵消的。感谢您的意见。