【问题标题】:Overlay View with Subview, don't know calling VCOverlay View with Subview,不知道调用VC
【发布时间】:2011-05-20 18:45:42
【问题描述】:

我需要一个视图 (infoView) 显示为覆盖在另一个视图之上。由于这个 infoView 应该可以从应用程序的每个视图(例如 introView)中调用,我希望代码位于 infoViews VC 中,并且只在 currentView(introView)的操作发生时调用它的方法。我不能使用 push 和 pop,因为我需要更改背景颜色 (infoView),尤其是调用视图 (introView) 的 alpha,所以我现在使用 insertSubview。

我现在的代码: introVC .h

- (IBAction) openInf:(id)sender;
IBOutlet InfoVC *infoScreenVC;

introVC .m

- (IBAction) openInf:(id)sender {
    [infoScreenVC openInfoMethod];}

infoVC .h

- (IBAction) closeInfoPressed;
- (void) openInfoMethod;
- (void) closeInfoMethod;

infoVC.m

- (IBAction) closeInfoPressed {
    [self closeInfoPressed];}

- (void) closeInfoMethod {
[self.view removeFromSuperview];
[self.xx.view setAlpha:1.0f];}

- (void) openInfoMethod {
self.view.backgroundColor = [UIColor clearColor];
[self.xx.view setAlpha:0.2f];
[((MyAppAppDelegate *)[UIApplication sharedApplication].delegate).window 
    insertSubview: self.infoScreenVC.view aboveSubview: self.xx.view];}

当我按下按钮显示 infoView 时,我的 NSLogs 告诉我该方法已被调用,但我可以看到未添加 Subview。我完全不知道在我的代码中现在它说 xx 的位置插入什么,因为来自 intro 的 VC 引用并没有向我显示屏幕。 如果我将该代码放入 introVC 并对其进行修改,它会显示 infoView,调用正确的方法关闭,但再次无法关闭(当我在 introVC 中时)。我不知道如何告诉我的应用程序谁是调用 VC 的人回到那里。 在某些时候,当所有代码都在 introVC 中时,我什至设法删除了 Subview,但无法将 introVC 的 Alpha 设置回 1。

这两天我确实在为此苦苦挣扎..-.- 或者有没有更简单的解决方案?

非常感谢!

//在sergios回答后编辑: 介绍.m

- (IBAction) openInf:(id)sender {
introViewController *introVC; 
[infoScreenVC openInfoMethod:];}

信息.h

- (void) openInfoMethod:(introViewController *introVC);

信息.m

- (void) openInfoMethod:(introViewController *introVC) { //error occurs here
self.view.backgroundColor = [UIColor clearColor];
[self.introVC.view setAlpha:0.2f];
[((MyAppAppDelegate *)[UIApplication sharedApplication].delegate).window 
insertSubview: self.infoScreenVC.view aboveSubview: self.introVC.view];}

并且发生的错误说

Expected ')' before 'introVC'

我不确定如何正确传递 VC 引用。 谢谢你的帮助!!

//编辑工作代码:

由于它现在有效,我想总结一下: - 我将调用 VC (introVC) 提供给 Action openInf 上的 openInfoMethod,例如 [infoVC openInfoMethod:introVC]

  • 在 openInfoMethod 中,我将调用 VC “保存”在 introVC (?) 类型的局部变量中,并添加覆盖等。

  • 当名为closeInfoPressed的infoViewController的Action发生时,它会像self closeInfoMethod:introVC一样调用infoViewController的方法closeInfoMethod。

  • 在该方法中,我从 Superview 中删除 self.view,并将 introVC.view 的 Alpha 设置为 1,如 introVC.view setAlpha:1.0f

所以coden-ps是
介绍.h

IBOutlet InfoscreenViewController *infoScreenVC;

@property (nonatomic, retain) IBOutlet InfoscreenViewController *infoScreenVC;
- (IBAction) openInf:(id)sender;

介绍.m

@synthesize infoScreenVC;
- (IBAction) openInf:(id)sender {
UIViewController *introVC = self;
[infoScreenVC openInfoMethod:introVC];
}

info.h:

- (void) openInfoMethod:(UIViewController *)rootVC;
- (void) closeInfoMethod:(UIViewController *)callingVC;

信息.m

- (void) closeInfoMethod:(UIViewController *)callingVC;{
[self.view removeFromSuperview];
[callingVC.view setAlpha:1.0f];
}

- (IBAction) closeInfoPressed{
[self closeInfoMethod:introVC];
[self.view removeFromSuperview];
}

【问题讨论】:

    标签: iphone objective-c viewcontroller


    【解决方案1】:

    如果您的问题是“弄清楚如何告诉我的应用谁是调用 VC 回到那里”,为什么不向 openInfo 选择器添加一个参数,如下所示:

    信息.h

    - (void) openInfoMethod:(introViewController *)introVC;
    

    信息.m

    - (void) openInfoMethod:(introViewController *)introVC {
        <your implementation here>
    }
    

    这对你有用吗?

    编辑:您来自 intro.m 的代码有一个小问题,

    - (IBAction) openInf:(id)sender {
        introViewController *introVC; 
        [infoScreenVC openInfoMethod:];
    }
    

    确实,您并没有初始化您的 introVC 变量,因此当您将它传递给 -openInfoMethod: 时,它会有一些奇怪的值并导致崩溃。

    据我所知,intro.m 应该是您的introViewController 的实现文件,因此您可以简单地调用:

        [infoScreenVC openInfoMethod:self];
    

    但请在执行此操作之前确认 self 实际上是您的 introViewController

    【讨论】:

    • @sergio 感谢您的回复,这听起来像是我需要的,但我不知道该怎么做.. 你能更具体一点吗? (看来我无法将代码发布到评论中,请查看我对我现在拥有的代码的编辑。谢谢!
    • @sergio 谢谢!像这样它编译没有任何错误或警告!但是当我运行应用程序时,当我调用这样的方法时它会崩溃:[infoScreenVC openInfoMethod:introVC];,在我创建了一个像 introViewController *introVC; 这样的引用之后。我(再次)说错了吗?
    • @sergio 再次感谢!在 introViewController.m 我有 introViewController *introVC = self; [infoScreenVC openInfoMethod:introVC];但它在那里崩溃。但这应该是正确的,不是吗?
    • @Nareille:我认为是这样,但您可以肯定地知道,如果您对该调用设置断点并检查 introVC 是否具有您期望的正确值。之后,我会进入openInfoMethod:(或在其第一行放置一个断点),一步一步调试,看看它在哪里崩溃并害羞......
    • @sergio //edit:我有带有分配属性的 *introVC,现在保留它可以工作。像这样我几天前就有了(在我试图让它工作时把它搞砸了-.-)所以现在 infoView 出现了,introVC 的 alpha 降低到 0.2,我也可以关闭 infoView(删除subview),但这就是我现在卡住的地方。如何告诉 close-Action 调用视图 (introVC) 是谁?谢谢!
    【解决方案2】:

    应该是这样的

    • (void) openInfoMethod:(introViewController *)introvc 您以错误的方式传递参数。

    【讨论】:

      【解决方案3】:

      如果我正确理解您的问题,您的 infoView 应该是 UIView 的子类,并使用以下任何视图控制器实例化:

      InfoView *infoView = [[InfoView alloc] initWithFrame:CGRectMake(originX,originY,width,height)];
      

      然后您只需将其添加为视图控制器视图的子视图:

      [self.view addSubView:infoView];
      [infoView release]; // It's safe to release it here as your view controller's view is retaining it
      

      完成后,只需调用

      [infoView removeFromSuperview];
      

      顺便说一句,您可以在 infoView 中创建一些简单的方法,包括在呈现或移除视图时引入动画。这是一个淡入淡出的示例,假设您在创建视图时最初将 alpha 设置为零:

      - (void)fadeIn {
          [UIView animateWithDuration:1.0f animations:^{self.alpha = 1.0f}];
      }
      

      然后淡出

      - (void)fadeOut {
          [UIView animateWithDuration:1.0f animations:^{self.alpha = 0f} 
                                           completion:^(BOOL finished){self removeFromSuperView}];
      }
      

      【讨论】:

      • 感谢您的回复! infoView 需要是 UIViewController 的,因为还应该有一些按钮,指向其他视图。我有一个类似的方法,一开始在调用 VC 中添加和删除子视图,但是随着必须添加更多的视图控制器,我不得不对每个视图控制器进行 c&p 操作,这似乎不是一个好主意,因为我可能需要更改 infoView 中的某些内容,而不是检查所有其他 ViewController。我会牢记动画,并在基本功能正常工作后立即添加它!
      猜你喜欢
      • 2014-03-31
      • 2022-11-21
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多