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