使用 UIView 中的按钮从另一个 ViewController 触发方法

Posted

技术标签:

【中文标题】使用 UIView 中的按钮从另一个 ViewController 触发方法【英文标题】:Triggering a Method from another ViewController using a button in a UIView 【发布时间】:2016-02-22 16:06:04 【问题描述】:

我遇到的问题是我想通过单击 UIView(页脚)内的按钮来调用 navigationController 中的方法。当我按下按钮时,它应该调用我试图访问的方法以在下面的代码中打开录像机。

有人告诉我我可以实现委托方法或使用 NSNotification。以下是我所拥有的:

我的页脚 (ESPhotoDetailsFooterView.m) 有我创建的按钮。我的页脚只包含一个 UIView。

我试图在页脚中访问的方法位于 (ESTabBarController.m)

这是我按下按钮时试图触发的:

RecorderViewController *viewController = [[RecorderViewController alloc] init];
    [viewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    [self.navController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    [self.navController pushViewController:viewController animated:NO];
    dispatch_async(dispatch_get_main_queue(), ^
        [self presentViewController:self.navController animated:YES completion:nil];
    );

我是 Objective C 的新手并且了解基础知识。我无法弄清楚我需要做什么来完成这个。任何帮助将不胜感激。

按钮的代码如下:

// Create a standard UIButton programmatically using convenience method
    UIButton *camButton = [UIButton buttonWithType:UIButtonTypeCustom];

    // Set the location (x,y) and size (width,height) of the button
    camButton.frame = CGRectMake(9.0f, 8.0f, 35.0f, 35.0f);

    // Create UIImages from image resources in your application bundle
    // using convenience methods (no need to release)
    UIImage *normal = [UIImage imageNamed:@"BingComm"];
    UIImage *highlighted = [UIImage imageNamed:@"BingCommClick"];

    // Set the button's background to an image
    [camButton setBackgroundImage:normal forState:UIControlStateNormal];
    [camButton setBackgroundImage:highlighted forState:UIControlStateHighlighted];

    // Add the target-action for the touch event
    #pragma GCC diagnostic ignored "-Wundeclared-selector"

    [camButton addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];

    [self.mainView addSubview:camButton];

【问题讨论】:

如何在故事板或代码中设置按钮?目前尚不清楚按钮的目标,即按下按钮时被告知的对象(理想情况下是某种类型的视图控制器)是否根据您上面描述的内容正确设置。如果您提供更多细节,我可能会让您朝着正确的方向开始 我在上面添加了我正在使用的按钮代码。 【参考方案1】:

是的,在这种情况下,委托是一个不错的选择,基本上您需要在页脚视图中添加一个委托对象。然后在运行时将委托设置为 TabBarController。 当用户单击按钮时,使用您的方法 [delegate method] 调用您的委托

这是一个非常重要的设计模式objective-c,如果您能按照本教程充分理解委托,将会非常有帮助。

http://www.alexefish.com/post/522641eb31fa2a0015000002

【讨论】:

【参考方案2】:

我同意委托很重要并且非常值得学习,但是解决相同问题的另一种方法是:

在 btnClicked 的方法定义中,调用以下代码

if([self tabBarController]) 
     [[self tabBarController] methodToCall];

由于您的视图控制器应该嵌入在标签栏控制器中,因此它将设置此属性。然后,您可以调用 tabBarController 类中包含的任何公共方法。

【讨论】:

以上是关于使用 UIView 中的按钮从另一个 ViewController 触发方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类访问 UIView 的宽度和高度?

iOS从另一个视图的一侧滑动一个UIView(菜单)

从另一个文件中的 SKScene 中删除 UIView

如何在 ios5 的 UIViewController 中显示 UIView?

如何从另一个 UIView 类访问 UIControl 的值

为啥我不能从另一个控制器中删除视图?