0

アクションシートボタンによってトリガーされたときに(おそらく)サブビューを表示する次のコードがあります。

- (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:clickedButtonAtIndex:UIActionSheet デリゲート メソッドで表示されていたため、アクション シートがビューの表示をブロックしているためだと考えていました。

利用可能な他の方法を見ると、(Apple Docsごとに)actionSheet:didDismissWithButtonIndex:私の問題を解決できるように思えました。This method is invoked after the animation ends and the view is hiddenまだ運がない!

メソッドが完了する前に、このサブビューをどのように提示するかについての考え。

4

1 に答える 1

3

同じメソッド(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: を変更し、少し遅延を追加することで、より長い時間後に削除するように設定できます。

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    [self.subviewToAdd performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:1.0];
    //[self.subviewToAdd removeFromSuperview];
}

于 2013-06-20T07:55:11.397 に答える