UIViewController removeFromSuperview错误

时间:2012-12-27 05:18:05

标签: ios uiviewcontroller

我有一个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];
}

3 个答案:

答案 0 :(得分:2)

[self.view removeFromSuperview];
你是什​​么意思??????删除主视图!!!!

答案 1 :(得分:2)

保留关于未应用适当的视图控制器控制权的保留意见,问题是您的handleLongPress将被多次调用recognizer.state个值,一次为UIGestureRecognizerStateBegan,另一个为{ {1}}。您应该检查手势的状态,例如:

UIGestureRecognizerStateEnded

原始答案:

我建议使用-(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关联的视图。如果你想要一个带有它自己的控制器的子视图,你必须使用包含(这只适用于iOS 5及更高版本)。在收容中,您有关键方法,如addChildViewController等。请参阅 View Controller Programming Guide 中的Creating Custom Container View Controllers或查看WWDC 2011 - Implementing UIViewController Containment。而且,顺便说一句,你也保持对handleLongPress的强引用,所以即使你成功删除了它的视图,你也会泄漏控制器。

花一点时间浏览收容文件/视频,我想你会想重新审视你如何展示你的菜单。这是一个密集的阅读,但值得真正理解。遏制是强大的,但必须正确。

答案 2 :(得分:1)

而不是直接使用

[self.view removeFromSuperview];

使用

 [[self.view.superview subviews] makeObjectsPerformSelector:@selector(removeFromSuperview) withObject:self.view];