Ios 从另一个类调用具有(id)sender的函数不起作用
我正在尝试使用以下命令从其他类调用具有Ios 从另一个类调用具有(id)sender的函数不起作用,ios,objective-c,xcode6,ibaction,Ios,Objective C,Xcode6,Ibaction,我正在尝试使用以下命令从其他类调用具有(id)sender的函数: -(IBAction) runAgainButton:(id)sender { ViewControllerName *instance = [[ViewControllerName alloc] init]; [instance startFunctionName:nil]; } 但该函数将不会执行。”startFunctionName'位于Class1.m中,我试图在Clas
(id)sender
的函数:
-(IBAction) runAgainButton:(id)sender {
ViewControllerName *instance = [[ViewControllerName alloc] init];
[instance startFunctionName:nil];
}
但该函数将不会执行。”startFunctionName
'位于Class1.m中,我试图在Class2.m中调用它。其他人在其他文章中建议将nil
传递给(id)发送者
,但这对我不起作用,我不知道还有什么可以代替nil
传递给(id)发送者
“
startFunctionName
”应创建一个摄像头视图控制器,以使用前向摄像头开始扫描条形码。第一次在ClassViewController
中调用此函数时(按下按钮后),相机会很好地加载并扫描我需要的内容。扫描后,它将加载Class2ViewController
,而我遇到的问题是“runAgainButton
”runAgainButton
”与应用程序中的按钮关联。当我点击该按钮时,它应该再次运行“start”功能,打开摄像头视图控制器开始扫描条形码。我只想将“startFunctionName
”的代码复制到另一个类中,但它有300多行代码。如果有人知道这里发生了什么并且能帮助我,那就太好了!谢谢 问题在于这一行:
ViewControllerName *instance = [[ViewControllerName alloc] init];
这里,您正在创建ViewControllerName类的一个全新的独立实例。但这是错误的例子。在视图控制器层次结构中的某个位置必须已经存在该类的实例,并且该实例就是您要与之对话的实例。您可以将引用从第一个视图控制器传递到第二个视图控制器,并将其存储为变量,然后直接调用它或根据其用法创建公共方法
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "GoToSecond" {
var secondViewController = segue.destinationViewController as! SecondViewController
secondViewController.firstViewController = self
}
}
然后,在第二个ViewController中,可以直接从上一个实例调用该方法
self.firstViewController.runAgainButton()
在类“Class2ViewController.h”中创建属性
@property (strong, nonatomic) Class1ViewController *class1VC;
在“ClassViewController.h”中声明iAction方法
并在“ClassViewController.m”文件中定义此方法
现在,当您从“ClassViewController”导航到“Class2ViewController”时,请将属性填充为:
其中“class2Object”是类“Class2ViewController”的实例
在类“Class2ViewController”中,您定义了方法
,其中“self.class1VC”包含类“Class2ViewController”的实例
-(IBAction) runAgainButton:(id)sender
{
[self.class1VC startFunctionName:nil];
}
希望它能解决你的问题
分配一个本地视图控制器不会让你走得很远;当该方法返回时,您认为视图控制器实例会发生什么情况?我将如何与该实例对话?您必须知道它在视图控制器层次结构中的位置,并获取对它的引用。这是一个非常有趣的问题,我的书中有很多章节专门讨论这个问题:您的解决方案是一个有趣的选择,我可能会进一步探讨它,但由于它现在是这样,并且在我的程序中实现了它,它不起作用。它实际上破坏了我的计划。不过,我很感谢你的努力。
class2Object.class1VC = self;
-(IBAction) runAgainButton:(id)sender
{
[self.class1VC startFunctionName:nil];
}