0

バー ボタンがタップされたときに、2 つのサブビューの追加をトリガーしようとしています。ただし、サブビューの追加は問題なく機能しますが、サブビューを削除しようとすると機能しません。

ここに私が実装しているコードがあります

-(IBAction)showPopover:(id)sender{

    UIView *popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; 

    UIView *popoverViewBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1000)];
    popoverView.alpha = 0.0;
    popoverView.layer.cornerRadius = 2;
    popoverView.layer.borderWidth = 0.1f;
    popoverView.layer.backgroundColor = [UIColor whiteColor].CGColor;
    popoverView.layer.masksToBounds = YES;

    popoverViewBackground.layer.backgroundColor= [UIColor blackColor].CGColor;
    if (popoverCount == 0) {
        [self.view addSubview:popoverViewBackground];
        [self.view addSubview:popoverView];
        popoverCount = 1;
    }else if (popoverCount ==1){
        [popoverView removeFromSuperview];
        [popoverViewBackground removeFromSuperview];
        popoverCount = 0;
    }
    [popoverViewBackground setAlpha:0.5];
    [popoverView setAlpha:1.0];    
}
4

4 に答える 4

3

問題は、ボタンをクリックするたびに新しいビューを作成しているため、古いビューを削除せずにコードをこのように配置すると、正常に動作することです。テストしました。

.h ファイル内

@interface secondViewController : UIViewController
{

    int popoverCount;

    UIView *popoverView ;

    UIView *popoverViewBackground;
}

.m ファイルで

- (void)viewDidLoad
{
    [super viewDidLoad];


    popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, -100, 320, 100)];

    popoverViewBackground = [[UIView alloc] initWithFrame:CGRectMake(0, -100, 320, 100)];
    popoverView.alpha = 0.0;
    popoverView.layer.cornerRadius = 2;
    popoverView.layer.borderWidth = 0.1f;
    popoverView.layer.backgroundColor = [UIColor whiteColor].CGColor;
    popoverView.layer.masksToBounds = YES;

    popoverViewBackground.layer.backgroundColor= [UIColor blackColor].CGColor;
}

-(IBAction)showPopover:(id)sender {

                if (popoverCount == 0) {
        [self.view addSubview:popoverViewBackground];

        [self.view addSubview:popoverView];

                [UIView animateWithDuration:0.5
                                 animations:^{
                                     popoverView.frame = CGRectMake(0,0,320,100);
                                 }
                                 completion:^(BOOL finished){
                                     ;
                                 }];
                [UIView animateWithDuration:0.5
                                 animations:^{
                                     popoverViewBackground.frame = CGRectMake(0,0,320,100);
                                 }
                                 completion:^(BOOL finished){
                                     ;
                                 }];
        popoverCount = 1;
    }else if (popoverCount ==1){


        [UIView animateWithDuration:0.5
                         animations:^{
                             popoverView.frame = CGRectMake(0,-100,320,100);
                         }
                         completion:^(BOOL finished){
                              [popoverView removeFromSuperview];
                         }];
        [UIView animateWithDuration:0.5
                         animations:^{
                             popoverViewBackground.frame = CGRectMake(0,-100,320,100);
                         }
                         completion:^(BOOL finished){
                             [popoverViewBackground removeFromSuperview];
                         }];


        popoverCount = 0;
    }
    [popoverViewBackground setAlpha:0.5];
    [popoverView setAlpha:1.0];   

}
于 2013-03-05T06:10:28.123 に答える
0

コードに少なくとも2つの問題があります。

  1. メソッドが関係するたびに、これらのサブビューの新しいインスタンスを作成しています
  2. 新しく作成されたインスタンスを削除しています。つまり、追加された以前のインスタンスはまだ存在します。

あなたがすべき

  • これらのサブビューをインスタンス変数に保存して、それらを参照して正しく削除できるようにします。
  • 作成コードを最初のifブロック内に移動して、作成するサブビューが多すぎないようにします。
于 2013-03-05T06:17:46.243 に答える
0

別のオブジェクトに addSubview と removeFromSuperview を適用しているために発生しています。

初めて showPopover が呼び出されると、
popoverView と popoverViewBackground という名前の UIView の 2 つのオブジェクトが作成されます。
これをself.viewに追加します。

これまではすべて問題ありませんでしたが、このメソッドを 2 回目に呼び出す
と、popoverView と popoverViewBackground の新しいオブジェクトが再度作成され、
そこにない self.view から新しく作成されたオブジェクトを削除しようとしています。

これを解決する方法:

これを解決するには、次の 2 つの方法があります。

1) このオブジェクトを .h ファイルに作成して、どこからでもアクセスできるようにします。

2)メソッドが初めて呼び出されたときにのみ作成されるようにオブジェクトを作成します。このUIViewタグを付けて、削除するとUIView.subviewでこのタグが見つかります

方法 1 は簡単です 方法 2 はいくつかのコードを必要としますが、メモリの効率を高めることができます。

ではごきげんよう

于 2013-03-05T06:19:18.250 に答える
0
UIView *popoverView;
UIView *popoverViewBackground;

.h ファイルで popoverView と popoverViewBackground を宣言し、popoverCount がゼロの場合にこれらのサブビューを割り当てて初期化します。

-(IBAction)showPopover:(id)sender{


    if (popoverCount == 0) {
    popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; 

    popoverViewBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1000)];
    popoverView.alpha = 0.0;
    popoverView.layer.cornerRadius = 2;
    popoverView.layer.borderWidth = 0.1f;
    popoverView.layer.backgroundColor = [UIColor whiteColor].CGColor;
    popoverView.layer.masksToBounds = YES;

    popoverViewBackground.layer.backgroundColor= [UIColor blackColor].CGColor;
        [self.view addSubview:popoverViewBackground];
        [self.view addSubview:popoverView];
        popoverCount = 1;
    }else if (popoverCount ==1){
        [popoverView removeFromSuperview];
        [popoverViewBackground removeFromSuperview];
        popoverCount = 0;
    }
    [popoverViewBackground setAlpha:0.5];
    [popoverView setAlpha:1.0];    
}
于 2013-03-05T06:10:53.277 に答える