0

我在 viewControllerA 中为另一个 viewControllerB 以编程方式创建视图和图像视图,然后转到 viewControllerB。我必须这样做,因为我使用的是 imagePickerController 中的图像。但是,通过这样做,touchesBegan 在 vi​​ewControllerB 中不起作用

我在 xib 的属性检查器和任何地方都以编程方式将 UserInteractionEnabled 设置为 true/yes!

我的 xib 只是一张空白画布,只有一个视图。我用连接检查器尝试了不同的设置,但仍然没有运气。

这是我的代码。

视图控制器A.m

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
    view = [[UIView alloc] initWithFrame:screenRect];

    image = [info valueForKey:UIImagePickerControllerEditedImage];

    SSViewController *psView = [[SSViewController alloc] initWithNibName:@"SSViewController" bundle:nil];
    psView.view = [[UIView alloc] initWithFrame:screenRect];
    [psView.view setUserInteractionEnabled:YES];
    [picker pushViewController:psView animated:YES];

    imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(20, 20, 280, 280);
    [imageView setUserInteractionEnabled:YES];
    [psView.imageView setUserInteractionEnabled:YES];
    [psView.view addSubview:imageView];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:psView action:@selector(endPS:) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"done" forState:UIControlStateNormal];
    button.frame = CGRectMake(140.0, 330.0, 80.0, 25.0);
    [psView.view addSubview:button];
}

viewControllerB.h (SSViewController.h)

@interface SSViewController : UIViewController
{
    IBOutlet UIImageView *imageView;
    IBOutlet UIView *view;
}
@property (nonatomic,strong) IBOutlet UIImageView    *imageView;
@property (nonatomic,strong) IBOutlet UIImage        *image;
@property (nonatomic, strong) IBOutlet UIView        *view;

- (IBAction)endPS:(id)sender;
@end

viewControllerB.m (SSViewController.m)

@implementation SSViewController

@synthesize imageView;
@synthesize image;
@synthesize view;

:
:

- (void)viewDidLoad
{
    [view setUserInteractionEnabled:YES];
    [imageView setUserInteractionEnabled:YES];

:
: 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touchesBegan");

:
4

1 回答 1

0

你做错了很多事情:

  1. 不要将视图控制器推到UIImagePickerController. 如果您以模态方式呈现它,我希望您有,您需要关闭它(在 viewControllerA 中)并将新的视图控制器 (viewControllerB) 推送到您自己的导航控制器上。您正在推动这个高度定制的导航控制器的事实很可能touchesBegan是没有被调用的原因。
  2. 为什么要手动为 viewControllerB 创建视图?如果您从 XIB 文件加载它,它将为您准备好一个非常好的视图。并且不要在 viewControllerB.h 中定义该view属性,它已经在 UIViewController.h 中定义了。
  3. 不要忘记调用[super viewDidLoad]viewControllerB.m。这是一个经典的错误,会让你很头疼。

编辑:

我个人会在 viewControllerB 上添加一个方法,如下所示:

视图控制器B.h

@interface SSViewController : UIViewController
{
   - (void)setImage:(UIImage *)image;
}
@end

视图控制器B.m

@implementation SSViewController
{
   - (void)setImage:(UIImage *)image
   {
      // In case the image view already exists, remove it first.
      [_imageView removeFromSuperview];
      _imageView = [[UIImageView alloc] initWithImage:image];
      _imageView.frame = CGRectMake(20, 20, 280, 280);
      [self.view addSubview:_imageView];
   }
}
@end

这样,在 viewControllerA.m 中,您只需创建 viewControllerB.m 并调用此setImage:方法即可让 viewControllerB 完成所有工作。

于 2013-09-15T10:21:52.727 回答