从另一个不工作的类调用具有(id)发送者的函数

时间:2015-04-14 15:01:25

标签: ios objective-c xcode6 ibaction

我正在尝试使用以下方法从另一个类调用具有(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 {1}}。
'startFunctionName'应该创建一个摄像机视图控制器,以使用前置摄像头开始扫描条形码。第一次在Class1ViewController中调用此功能(按下按钮后),相机完全加载并扫描我需要的内容。扫描完成后,它会加载Class2ViewController以及我遇到'runAgainButton'问题的地方。 “runAgainButton”与应用中的按钮相关联。当我点击该按钮时,它应该通过打开摄像机视图控制器再次运行“startFunction”以开始扫描条形码。我只是将“startFunctionName”的代码复制到另一个类中,但它是300多行代码。如果有人知道这里发生了什么,可以帮助我,那将是伟大的!谢谢!

3 个答案:

答案 0 :(得分:2)

问题在于这一行:

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

在这里,您将创建一个全新且独立的ViewControllerName类实例。但那是错误的实例已经已经在视图控制器层次结构中的某个位置,而 是您要与之对话的实例。

答案 1 :(得分:0)

您可以将第一个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()

答案 2 :(得分:0)

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