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的主要内容,如果未能解决你的问题,请参考以下文章