ios从不同的类回调viewController

Posted

技术标签:

【中文标题】ios从不同的类回调viewController【英文标题】:ios Calling back viewController from different class 【发布时间】:2013-08-19 18:42:33 【问题描述】:

我在从 nsobject 类回调我的 viewController 时遇到问题。这是我的代码:

视图控制器:

-(void)startTest:(NSString*)testToRun

    ViewController *ViewController = [[[ViewController alloc] init] autorelease];
    SecondClass *secondClass = [[SecondClass alloc] init];
    secondClass.viewController = viewController;
    [secondClass doSomething];


-(void) createView

    UIView *newView = [UIView alloc] initWithFrame:[self.view bounds];
    self.newView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:newView];
    [self.view bringSubviewToFront:newView]



NSObject classe:

.h file

#import "ViewController.h"

@class ViewController;

@interface SecondClass : NSObject

    ViewController *viewController;


@property (nonatomic,retain) ViewController *viewController;

-(void) doSomething;


.m file

-(void) doSomething

    [viewController createView];


你们中的任何人都可能知道我做错了什么或者我如何从我的 nsobject 类中回调我的视图控制器?

【问题讨论】:

检查 viewController 是否仍然存在,并且在您调用它时不为零。 在将指针从视图控制器传递到 nsboject 类的那一刻不是空的,但是在 nsobject 类中的时间是空的,我不明白为什么 @Jeff,我没有使用 ARC 您是在上面合成自己的 get/setter 还是只使用自动生成的? 在某些时候,您需要为您的 TestRunner 类实例提供一个指向您的 ViewController 对象的指针。我建议放置两个类的完整代码,以及创建 TestRunner 和 ViewController 实例的完整代码,这样人们就可以检查你是否在它们之间传递了必要的指针。仅仅因为您在 TestRunner 中为 ViewController 声明了一个属性,并不意味着出现了其他东西并为您的 TestRunner 实例提供了该属性的有效指针。 【参考方案1】:

您指的是 实例变量 viewController,但正在分配 属性 viewController

默认情况下,该属性会自动合成为一个名为_viewController 的实例变量。您可以将其更改为显式合成到您的实例变量,但更规范的做法是使用默认的 _viewController 并在您的实现文件中将其称为 self.viewController

【讨论】:

我就是这么想的。除非您在某处有其他代码处理 getter/setting,否则这是您的问题 HelenaM。【参考方案2】:

我认为你的问题在于下面的代码

-(void)startTest:(NSString*)testToRun

    ViewController *ViewController = [[[ViewController alloc] init] autorelease];
    SecondClass *secondClass = [[SecondClass alloc] init];
    secondClass.viewController = viewController;
    [secondClass doSomething];

我相信上面这段代码是在ViewController 本身中定义的,所以你应该这样做

-(void)startTest:(NSString*)testToRun

    //ViewController *ViewController = [[[ViewController alloc] init] autorelease]; Don't do this, it is already initialized
    SecondClass *secondClass = [[SecondClass alloc] init];
    secondClass.viewController = self;//assign self as reference
    [secondClass doSomething];

为了更完美,您也可以尝试使用Protocols

【讨论】:

如果我使用 secondClass.viewController = self; secondClass 中 viewController 的实例为 nil。

以上是关于ios从不同的类回调viewController的主要内容,如果未能解决你的问题,请参考以下文章

可以具有不同基成员实现的类的最佳实现

libevent 是不是允许在不同的线程中运行定时器/io 的回调?

iOS可以附加回调并关联不同的发件人吗?

MOOS学习笔记4——独立线程不同回调

捕获在jQuery回调函数中匹配的类

关闭一个视图控制器并显示另一个视图控制器