4

UIViewControllerそれを長self.view押しするとポップアップが表示されます(MenuViewController)。しかし、ポップアップを削除しようとするremoveFromSuperviewと、それでも表示されます

このhttp://www.youtube.com/watch?v=nVVgmeJEnnYで私の問題の詳細を見ることができます

ViewController.m

#import "MenuViewController.h"
@interface ViewController () {
    MenuViewController *menu;
}
....
- (void)viewDidLoad
{
    ....
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(albumButtonPressed : ) name:@"albumButtonPressed" object:nil];
    ....
}

....

-(void)albumButtonPressed : (NSNotification*) notification {
    UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init];
    photoPicker.delegate = self;
    photoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    [self presentModalViewController:photoPicker animated:YES];
}

...

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer {
    menu = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil];
    if (self.imageView.image != nil) {
        menu.imageAdded = YES;
    }
    [self.view addSubview:menu.view];
}

MenuViewController.m

-(IBAction)albumButtonPressed:(id)sender {
    [self.view removeFromSuperview];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"albumButtonPressed" object:nil];
}
4

3 に答える 3

2
[self.view removeFromSuperview];

これはどういう意味ですか?????? メインビューを削除!!!!

于 2012-12-27T05:32:43.203 に答える
2

適切なView Controllerコンテインメントを適用しないという私の留保は別として、問題は、あなたがhandleLongPress異なるrecognizer.state値で複数回呼び出されることです。ジェスチャの状態を確認する必要があります。たとえば、次のようになります。UIGestureRecognizerStateBeganUIGestureRecognizerStateEnded

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer {
    if (recognizer.state == UIGestureRecognizerStateEnded) {
        menu = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil];
        if (self.imageView.image != nil) {
            menu.imageAdded = YES;
        }
        [self.view addSubview:menu.view];
    }
}

元の回答:

NSLog使用してコードに または ブレークポイントを配置し、そのコードにremoveFromSuperview到達しているかどうかを確認することをお勧めします。

ここにはいくつかの明確な問題があります。MenuViewController具体的には、handleLongPress適切に関連付けられたビューを追加していません。独自のコントローラーを備えたサブビューが必要な場合は、コンテインメントを使用する必要があります (これは iOS 5 以降でのみ機能します)。addChildViewControllerまた、コンテインメントには、 などの重要なメソッドがあります。ビュー コントローラー プログラミング ガイドカスタム コンテナー ビュー コントローラーの作成 を参照するか、WWDC 2011 - UIViewController コンテインメントの実装を参照してください。余談ですが、 への強い参照も維持しているため、そのビューの削除に成功したとしても、コントローラーをリークすることになります。MenuViewController

少し時間をかけて封じ込めの文書/ビデオを読んでください。メニューの提示方法を再検討したいと思うでしょう。これは読みにくいですが、本当に理解する価値があります。封じ込めは強力ですが、正しく行う必要があります。

于 2012-12-27T05:34:03.133 に答える
1

直接使用する代わりに

[self.view removeFromSuperview];

使用する

 [[self.view.superview subviews] makeObjectsPerformSelector:@selector(removeFromSuperview) withObject:self.view];
于 2012-12-27T06:43:34.303 に答える