【问题标题】:iOS: NSObject call and detecting which UIVIewController made the calliOS:NSObject 调用并检测哪个 UIVIewController 进行了调用
【发布时间】:2012-04-10 01:05:22
【问题描述】:

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

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

UIViewControllers 然后像这样调用 NSObject;

[ThisNSObject doSomething];

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

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

我知道我可以访问 keyWindow,但我不确定这正是我想要的。

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

罗伊

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

【问题讨论】:

    标签: ios uiviewcontroller nsobject


    【解决方案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"];
    

    希望这会有所帮助。

    【讨论】:

    • 糟糕,教我输入代码而不是剪切和粘贴 :-) 会更正我的答案。
    【解决方案2】:

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

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

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

    [theObject doSomethingWithViewController:self];
    

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

    附:如果您有其他参数,另一种签名样式可能是

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2011-09-01
      • 2013-10-05
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多