【问题标题】:Calling a function with (id)sender from another class not working从另一个类调用带有(id)sender的函数不起作用
【发布时间】:2015-04-14 15:01:25
【问题描述】:

我正在尝试从不同的类调用具有(id)sender 的函数:

    -(IBAction) runAgainButton:(id)sender {
        ViewControllerName *instance = [[ViewControllerName alloc] init];
        [instance startFunctionName:nil];
    }

但函数不会执行。 'startFunctionName' 位于 Class1.m 中,我试图在 Class2.m 中调用它。其他人建议在其他文章中将nil 传递给(id)sender,但它对我没有用,我想不出还有什么可以代替nil(id)sender
'startFunctionName' 应该创建一个摄像头视图控制器来开始使用前置摄像头扫描条形码。第一次在Class1ViewController 中调用此函数(按下按钮后),相机加载非常好并扫描我需要的内容。扫描后,它将加载Class2ViewController 以及我遇到“runAgainButton”问题的地方。 'runAgainButton' 与应用程序中的按钮相关联。当我单击该按钮时,它应该通过打开相机视图控制器开始扫描条形码再次运行“startFunction”。我只会复制“startFunctionName”的代码以在其他类中工作,但它有 300 多行代码。如果有人知道这里发生了什么并且可以帮助我,那就太好了!谢谢!

【问题讨论】:

  • 分配一个 local 视图控制器不会让你走得太远;当该方法返回时,您认为视图控制器实例会发生什么?

标签: ios objective-c xcode6 ibaction


【解决方案1】:

问题出在这一行:

ViewControllerName *instance = [[ViewControllerName alloc] init];

在这里,您正在创建 ViewControllerName 类的全新且独立的实例。但那是错误的实例。在您的视图控制器层次结构中的某处必须已经有这个类的一个实例,而 那个 就是您要与之交谈的实例。

【讨论】:

  • 那我将如何与那个实例交谈?
  • 您必须知道它在视图控制器层次结构中的位置并获得对它的引用。这是一个非常有趣的问题,以至于我的书中的大部分章节都专门讨论它:apeth.com/iOSBook/ch13.html#_visibility_by_relationship
【解决方案2】:

您可以将第一个 viewController 的引用传递给第二个 viewController 并将其存储为变量,然后直接调用它或根据其使用情况创建一个公共方法。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "GoToSecond" {
        var secondViewController = segue.destinationViewController as! SecondViewController
        secondViewController.firstViewController = self 
    }
}

然后在您的 secondViewController 中,您可以直接从前一个实例调用该方法。

self.firstViewController.runAgainButton()

【讨论】:

    【解决方案3】:
    1. 在类'Class2ViewController.h'中创建一个属性
      @property (strong, nonatomic) Class1ViewController *class1VC; 
    2. 在“Class1ViewController.h”中声明您的 ibaction 方法
      - (IBAction)startFunctionName: (id) sender;
      并像通常在“Class1ViewController.m”文件中一样定义此方法。
    3. 现在,当您从“Class1ViewController”导航到“Class2ViewController”时,将属性填写为:
      class2Object.class1VC = self;
      其中“class2Object”是“Class2ViewController”类的实例
    4. 在“Class2ViewController”类中,您定义了方法
       -(IBAction) runAgainButton:(id)sender
      {
          [self.class1VC startFunctionName:nil];
      }
      ,其中“self.class1VC”包含“Class2ViewController”类的实例
    5. 希望它能解决您的问题。

    【讨论】:

    • 您的解决方案是一个有趣的选择,我可能会对其进行更多探索,但现在它已经在我的程序中实现了,它不起作用。它实际上破坏了我的项目。不过我很感激你的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多