Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:NSObject调用并检测哪个UIVIewController进行了调用_Ios_Uiviewcontroller_Nsobject - Fatal编程技术网

iOS:NSObject调用并检测哪个UIVIewController进行了调用

iOS:NSObject调用并检测哪个UIVIewController进行了调用,ios,uiviewcontroller,nsobject,Ios,Uiviewcontroller,Nsobject,希望这是一个简单的 我有一个NSObject,其方法在多个UIViewController中使用(NSObject导入到我的.pch文件中) 然后UIViewController像这样调用NSObject [thinsobjectdosomething] 这一切都在计划中,所以没有问题。。。但是,我希望doSomething方法能够检测哪个UIViewController对该对象进行了调用。然后,基于这些信息,我可以以任何给定的方式操纵UIViewController 我之所以需要这样做,是因为

希望这是一个简单的

我有一个NSObject,其方法在多个UIViewController中使用(NSObject导入到我的.pch文件中)

然后UIViewController像这样调用NSObject

[thinsobjectdosomething]

这一切都在计划中,所以没有问题。。。但是,我希望doSomething方法能够检测哪个UIViewController对该对象进行了调用。然后,基于这些信息,我可以以任何给定的方式操纵UIViewController

我之所以需要这样做,是因为如果我有一个UIAbbar,每个选项卡都加载了不同的UIViewController,但都调用了全局NSObject,那么我需要将进一步的操作定向到一个特定的UIViewController

我知道我可以使用keyWindow,但我不确定这正是我想要的

任何建议都很好,谢谢

罗伊

编辑:
实际上,也许在NSObject中,我可以检测当前选择的选项卡,然后在堆栈中获取顶部视图。。。这样做参考?有人想过为什么这是个坏主意吗?

使用运行时代码,您可能可以回溯调用堆栈,但对于一个简单的问题,这是一个相当复杂的解决方案。我建议您参考API获得灵感,并修改doSomething方法,以采用如下控制器参数:

-(void) doSomethingWithViewController:(UIViewController *) viewController;
[theObject doSomethingWithViewController:self];
通过这种方式,当您可以使用剂量测量法时,您可以向self传递一个引用,如下所示:

-(void) doSomethingWithViewController:(UIViewController *) viewController;
[theObject doSomethingWithViewController:self];
你的问题就解决了——很简单

另外,如果您有其他参数,可以选择其他签名样式

-(void) viewController:(UIViewController *) viewController doSomethingWithX:(id) x;

这完全取决于什么对你最有意义。

我有点同意@drekka的答案,但它有一个问题……代码行:

- (void) viewController:(UIVIewController*)viewController doSomething;
语法上不正确。然而,他通过提出另一个正确的解决方案来弥补自己的不足:

- (void) doSomethingWithViewController:(UIViewController*) viewController;
另一种方法是在自定义类上使用委托,并让ViewController作为委托订阅,因为在您的情况下,将ViewController作为参数传递似乎没有什么意义。例如:

@protocol MyCustomNSObjectDelegate;

@interface MyCustomNSObject : NSObject

@property (nonatomic, assign) id<MyCustomNSObjectDelegate delegate;

- (void) doSomething;

@end

@protocol MyCustomNSObjectDelegate <NSObject>
@required
- (void) myCustomNSObject:(MyCustomNSObject*)myObject takeFurtherActionWithData:(NSString*)someData;
@end

希望这能有所帮助。

Oops,教我如何键入代码,而不是剪切和粘贴:-)将更正我的答案。