【问题标题】:can't dismiss presentModalViewController无法关闭 presentModalViewController
【发布时间】:2012-10-30 12:11:49
【问题描述】:

我在 iphone 应用程序中有两个视图控制器。

1.) 第一VC

2.) 第二个VC

在我的 FirstVC 中,我有一个按钮。通过点击该按钮,我在presentModalViewController 中打开了 SecondVC。看下面的代码。

- (IBAction)buttonClicked:(id)sender
{
    SecondVC *secondVC = [SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
    [self.navigationController presentModalViewController:secondVC animated:YES];
}

现在移至 SecondVC。在 SecondVC 上,我创建了导航栏以及“取消”按钮作为 leftBarButtonItem。我在取消按钮上设置了一个按钮单击事件。在那种方法中,我想解雇 SecondVC。波纹管方法在 SecondVC 中。看下面的代码。

- (void)cancelButtonClicked
{
  [self dismissModalViewControllerAnimated:YES];
}

此代码不起作用。我不能通过这段代码解雇 SecondVC。请提出其他技巧。

【问题讨论】:

  • 当你尝试显示 secondVC 视图时,只需删除 navigationController...试试
  • @ParasJoshi:我也试过了。但没有运气。
  • 首先确认您没有在某个线程运行时关闭它。
  • @ForamMukundShah:没有。没有线程在运行。
  • 好的。虽然我建议你写 '[self performSelectorOnMainThread:@selector(cancelButtonClicked) withObject:nil waitUntilDone:YES]; '

标签: iphone uiviewcontroller presentmodalviewcontroller


【解决方案1】:

把按钮代码改成这个..

- (IBAction)buttonClicked:(id)sender
{
    SecondVC *secondVC = [SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
 [self presentViewController:secondVC animated:YES completion:NULL];

}

取消按钮点击

-(void)cancelButtonClicked {
 [self.presentingViewController dismissViewControllerAnimated:YES completion:NULL];

}

【讨论】:

  • 我试过了,但是当我点击 - (void)cancelButtonClicked 时给我错误的访问错误。
  • 你用过完全一样的..dismissed using self.parentViewController??
  • - (void)cancelButtonClicked { [self.parentViewController dismissModalViewControllerAnimated:YES]; } 。这是我尝试过的。
  • 你是否将取消按钮连接到目标方法..它被正确调用了吗??
  • 和用来呈现的东西..应该是[self presentModalViewController]..只是想确定
【解决方案2】:

您正在向错误的对象发送dismissModalViewControllerAnimated: 消息。

既然你通过导航控制器展示了模态视图控制器,那么你应该调用:

[self.presentingViewController dismissModalViewControllerAnimated:YES];

这适用于 iOS 5 及更高版本。如果您只针对 iOS 5 和更新版本,您还可以考虑使用其上可用的更新方法来管理模态视图控制器:

– presentViewController:animated:completion:
– dismissViewControllerAnimated:completion:

但我认为这不是强制性的。

如果你想支持 iOS 4 和更早的版本,你应该在你的模态视图控制器中添加一个属性:

@interface SecondVC : UIViewController
@property (nonatomic, weak/assign) UIViewController* presentingController;
...
@end

并在模态显示控制器之前设置它:

- (IBAction)buttonClicked:(id)sender
{
     SecondVC *secondVC = [SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
     secondVC.presentingController = self.navigationController;
     [self.navigationController presentModalViewController:secondVC animated:YES];
}

那么你会使用:

[self.presentingController dismissModalViewControllerAnimated:YES];

【讨论】:

  • 第二个 VC 只是模态的呈现。它不是导航控制器堆栈的一部分。因此,第二个 VC 中的 self.navigationController 将评估为 nil
  • @Summer:你完全正确。我太仓促了。我改变了答案。
  • 您现在正在向 presentingViewController 发送解除消息,但使用的是解除控制器的旧方式。
  • 再次感谢您;我相信这一切都会奏效,但我添加了一条关于 iOS>5 下新方法可用性的注释。
  • 理想的答案不应该是这一切。完美的解决方案是委托。呈现视图控制器将是呈现控制器的委托。当在呈现的控制器上单击取消按钮时,它会将其委托给它的委托,就像这样 - [self.delegate secondControllerDidCancel:self]。然后呈现控制器将实现该方法并仅向其自身发送关闭消息。这提供了更好的封装和通信。就像它在 Mail Composer、Camera 等上的工作方式一样。
【解决方案3】:

现在试试这个 secondVC...

[self presentModalViewController:secondVC animated:YES];

【讨论】:

    【解决方案4】:

    请将您的代码替换为以下...代码

    - (IBAction)buttonClicked:(id)sender
    {
        SecondVC *secondVC = [SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
        [self presentModalViewController:secondVC animated:YES];
    }
    
    - (void)cancelButtonClicked
    {
       [self dismissModalViewControllerAnimated:YES];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多