0

希望这是一个简单的...

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

UIViewControllers 然后像这样调用 NSObject;

[ThisNSObject doSomething];

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

我需要这个的原因是因为如果我有一个 UITabBar,每个 Tab 加载一个不同的 UIViewController,但都调用全局 NSObject,我需要对那个特定的 UIViewController 进行进一步的操作。

我知道我可以访问keyWindow,但我不确定这正是我所追求的。

任何建议都会很棒,谢谢。

罗伊

编辑: 实际上,也许在 NSObject 中我可以检测到当前选择了哪个选项卡,然后获取堆栈中的顶部视图......并进行这样的引用?有没有人想过为什么这是一个坏主意?

4

2 回答 2

1

我有点同意@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

然后在你的 UIViewController

#import "MyCustomNSObject.h"

@interface MyUIViewController : UIViewController <MyCustomNSObjectDelegate>

...

然后在调用 doSomething 之前将 MyCustomNSObject 的委托属性设置为 UIViewController。在 doSomething 方法中,在 if 完成“某事”之后,在方法的末尾添加:

[self.delegate myCustomNSObject:self takeFurtherActionWithData:@"change this to whatever type you need here"];

希望这可以帮助。

于 2012-04-10T04:05:14.860 回答
0

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

-(void) doSomethingWithViewController:(UIViewController *) viewController;

这样,当您可以使用 doSomething 方法时,您可以像这样传递对 self 的引用:

[theObject doSomethingWithViewController:self];

你的问题就解决了——很简单。

PS如果你有其他参数,另一种签名样式可能是

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

这一切都取决于什么对你最有意义。

于 2012-04-10T02:12:55.867 回答