【问题标题】:Using an UIView from one UIViewController in another UIViewController?在另一个 UIViewController 中使用来自一个 UIViewController 的 UIView?
【发布时间】:2014-04-14 22:09:24
【问题描述】:

正如您在标题中看到的,我想在另一个 UIViewController 中显示来自一个 UIViewController 的 UIView。 这样做的原因是,我想在情节提要的额外 UIViewController 中设计 UIView,但在我的 MainViewController 中将它用作应用程序主要运行的覆盖视图。

我尝试了以下方法: 在 MainViewController 中,我创建了第二个 UIViewController 的实例,并将其视图保存在我称为 overlayView 的 UIView 中。

UIViewController* rvc = [self.storyboard instantiateViewControllerWithIdentifier:@"overlayView"];
self.overlayView = rvc.view;

在那一步之后,我以为我只是将它添加为子视图,但遗憾的是它不起作用。

[self.view addSubview:self.overlayView];

有什么遗漏或者我应该尝试一些完全不同的东西吗?

提前致谢:)

编辑:现在的问题是,通过按下 overlayView 的按钮会发生名为 BAD_ACCESS 的错误。

我创建了一个 ViewController,我将其视图 alpha 调节为 0.9。到目前为止,我在这个视图上添加了一个简单的按钮。在我的 MainViewControllers viewDidLoad 方法中,我使用以下代码来初始化“新”ViewControllers 视图:

UIStoryboard* st = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    UIViewController* vc = [st instantiateViewControllerWithIdentifier:@"overlayView"];
    self.overlayView = vc.view;
    [self addChildViewController:vc];
    self.overlayView.alpha = 0.0;

作为下一步,我通过按下 MainViewController 上的一个按钮“调用”overlayView 出现,并为 alpha 设置动画以实现平滑的淡入:

[self.view addSubview:self.overlayView];

[UIView animateWithDuration:1.3 animations:^{
    self.overlayView.alpha = 0.9;
}];

现在,如果我按下 overlayView 上的按钮,我希望它调用 MainViewController 的一个方法,该方法正在做一些事情并让 overlayView 消失。对于这种情况,我使用了 NSNotificationCenter。 但是通过按下这个按钮(在overlayView上),main.m中出现以下错误:

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x128a60cd0)

首先我认为问题是由 NSNotificationCenter 引起的。所以我尝试使用委托来调用该方法。但这没有帮助。

委托代码: OverlayViewController.h

@class OverlayViewController;

@protocol OverlayViewControllerDelegate
- (void) setToNormalAction;
@end

@interface OverlayViewController : UIViewController

@property (weak, nonatomic) id <OverlayViewControllerDelegate> delegate;
@property (strong, nonatomic) IBOutlet UIView *overlayView;

- (IBAction)buttonTouchUpInside:(id)sender;

@end

按钮方法:

- (IBAction)buttonTouchUpInside:(id)sender
{
    [self.delegate setToNormalAction];
}

在 MainViewController.h 中,我实现了已知的创建的“OverlayViewControllerDelegate”,在 .m 中,我使用声明的方法来淡出覆盖视图并做一些其他的事情。

你有解决这个问题的想法吗?

提前致谢

【问题讨论】:

  • 在什么情况下不起作用?它有什么frame 应该有什么?你还留着rvc吗?
  • 按钮委托的代码在哪里?
  • 什么时候出现错误? buttonTouchUpInside 方法会被调用吗?
  • 哦,该方法没有被调用...我为它设置了一个断点,但它像往常一样在 main.m 类中中断(与以前的错误相同)。似乎,Xcode 不喜欢这件事,我将 ViewController 的视图显示为覆盖而不推送或呈现......希望有一个解决方案:)

标签: ios objective-c uiview uiviewcontroller


【解决方案1】:

试试……

UIViewController* rvc = [self.storyboardinstantiateViewControllerWithIdentifier:@"overlayView"];
self.overlayView = rvc.view;
[self addChildViewController:rvc];
[self.view addSubview:self.overlayView];

【讨论】:

  • 非常感谢。现在像魅力一样工作!唯一的问题:如果我单击overlayedView 的按钮,Xcode 会显示一个名为 BAD_ACCESS 的错误...我该如何解决这个问题?
  • 我需要更多详细信息,更新您问题中的代码并指出错误发生的位置。
  • 我不认为,问题是委托,因为使用 NSNotificationCenter 而不是委托也会发生错误...
【解决方案2】:

你可以把它设计成一个 nib 中的视图,然后就不需要额外的 VC 来放置它,以及会带来的所有麻烦。

除了拥有故事板之外,没有什么可以说明您不能继续使用 nib。

【讨论】:

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