【问题标题】:Unrecognized selector sent to instance when trying to dismissViewController尝试解除 ViewController 时发送到实例的无法识别的选择器
【发布时间】:2014-04-21 19:16:28
【问题描述】:

我在视图控制器上有一个按钮,它显示了一个模态视图控制器。在 viewcontroller 的 init 方法中,我正在初始化一个 UIImage 视图,在它之上是一个自定义视图,在最后一个之上我有一个按钮(完成)。当我按下完成按钮时,我想关闭模态视图控制器,并且我想弹出初始视图控制器(呈现模态视图控制器的那个)。问题是我收到以下错误:

2014-04-21 19:31:16.223 Signature[5343:60b] -[UIImageView setEnableSetNeedsDisplay:]: unrecognized selector sent to instance 0x16d73550

以下是相关代码:

这是我实例化模态视图控制器时执行的操作:

- (void) onSignButtonPressed: (id)sender
{

    PPSSignatureViewController *ppsSignatureViewController = [[[PPSSignatureViewController alloc] initWithNibName:nil bundle:nil documentViewController:self] autorelease];

    ppsSignatureViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    [self presentViewController:ppsSignatureViewController animated:NO completion:^{
        printf("done!!!");
    }];

    [self.navigationController popViewControllerAnimated:YES];
}

这是在模态视图控制器被实例化时执行的代码:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil documentViewController:(MuDocumentController*)dController
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        EAGLContext * context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
        PPSSignatureView *signatureView =
        [[[PPSSignatureView alloc] initWithFrame:[[UIScreen mainScreen] bounds] context:context] autorelease];
        signatureView.opaque = NO;
        signatureView.backgroundColor = [UIColor clearColor];

        UIGraphicsBeginImageContext(dController.view.bounds.size);
        [dController.view drawViewHierarchyInRect:dController.view.bounds afterScreenUpdates:YES];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        UIImageView *backView = [[UIImageView alloc] initWithImage:image];

        signatureView.frame = backView.bounds;

        UIButton *finishSignatureButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [finishSignatureButton addTarget:self
                                  action:@selector(finishSignatureButtonPressed:)
                        forControlEvents:UIControlEventTouchUpInside];
        [finishSignatureButton setTitle:@"Salveaza semnatura" forState:UIControlStateNormal];
        finishSignatureButton.frame = CGRectMake(signatureView.frame.size.width - 210, signatureView.frame.size.height - 50, 200, 40.0);
        finishSignatureButton.backgroundColor = [UIColor whiteColor];

        [backView addSubview:finishSignatureButton];

        self.view = backView;

        self.view.backgroundColor = [UIColor clearColor];

        [backView release];
        [finishSignatureButton release];
        [signatureView release];
        [image release];
    }

    return self;
}

最后这是由finishSignatureButton触发的代码:

- (void) finishSignatureButtonPressed: (id)sender
{
    printf("DOne");
    [self.presentingViewController dismissViewControllerAnimated:YES completion: nil];  
}

我需要知道我做错了什么?我是客观 C 编程的菜鸟。我尝试以多种方式消除视图,但都没有成功......另外,我不知道我所做的是否正确以及订单是否正常。签名视图控制器的 init 方法中的操作顺序似乎很重要。任何帮助都感激不尽。

【问题讨论】:

  • 我在顶部看到一个autorelease。这些天您为什么不使用自动引用计数 (ARC)?
  • 谢谢!我启用了 ARC 模式,重构了代码,效果很好。没有更多的内存问题!

标签: objective-c ios7 uiviewcontroller presentmodalviewcontroller


【解决方案1】:

我看到的最大问题是这一行:

self.view = backView;

您正在尝试用 UIImageView 替换视图控制器的视图属性 - 这是好的。不应以这种方式操纵视图控制器的视图属性。您应该向其中添加子视图,而不是完全替换它。您的应用程序正在尝试在(我假设的)视图控制器的视图上调用方法 (setEnableSetNeedsDisplay:)。由于您已将其替换为 UIImageView 的实例,因此您会遇到异常,因为 UIImageView 未实现此方法。

相反,请执行以下操作:

[self.view addSubview:backView];

请注意,您也可以通过这种方式将任何其他子视图添加到视图中,因此您的按钮不必是图像的子视图,但可以是视图控制器视图的直接子视图。

【讨论】:

  • 谢谢!这解决了我的问题。我在前一个之上添加了一个视图,而不是调用 self.view addSubview。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多