0

我想知道是否有办法通过使用 UINavigationController 来判断当前正在显示哪个 UIViewController。

我有一个委托,我在其中将一些信息返回给特定的 UIViewController 但是现在我想要获取相同的数据并根据 if 语句将其返回到不同的 UIViewController,即哪个 UIViewController 调用了我拥有的特定请求方法,所以反过来,我可以将数据返回到正确的 UIViewController。

如果有人知道如何做到这一点,我将不胜感激:)

4

3 回答 3

0

请注意,只有当您要查找的视图控制器存在于同一导航控制器的导航堆栈中时,这些解决方案才有效。

于 2013-10-16T08:55:59.227 回答
0

一般来说,如果您希望一个对象根据其现有属性实例变量存储/返回它通常不存储的信息,您可以使用 Objective-c 的运行时对象关联

所以考虑这个类别:

#import "NSObject+Addons.h"
#import <objc/runtime.h>    

@implementation NSObject (Addons)

static char infoKey;

-(id)info {
    return objc_getAssociatedObject(self, &infoKey);
}

-(void)setInfo:(id)info {
    objc_setAssociatedObject(self, &infoKey, info, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

现在假设我们在viewController1里面并且它提出了一个特定的请求..所以你可以把这个代码

//viewController1.m

// make specific request
// now store in UINavBar name of this viewcontroller
// (you can use an enum here instead if you like)
[self.navigationController setInfo@"viewController1"];    

所以稍后在您的代码中,当您想将数据返回到发出该特定请求的返回控制器时(您没有确切说明在哪里)..您可以检查信息的值:

if ([[navigationController info] isEqualToString:@"viewController1"]]) {
   //do stuff 
} else if ([[navigationController info] isEqualToString:@"viewController2"]]) {
   // etc..

这是快速解决方案.. 但是,如果它是我自己的代码.. 我会使用调解器模式.. 基本上创建一个控制器控制器(我们就称之为控制器),并使其成为单例。该对象将保留中间信息,例如哪个视图控制器做了什么,并在必要时返回该信息。在UINavigationBar上面的代码中,我们正在使用运行时拼凑代码来实现它。使用控制器的控制器更加健壮,并且该概念可以涵盖大多数项目的许多其他有用任务。这个想法是对修改关闭但对扩展开放的设计代码。

于 2013-10-16T04:07:47.733 回答
0

您可以在 UINavigationController 中获取有关所有 UIViewController 推送的信息。

尝试这个。

NSArray *viewCtrls = self.navigationController.viewControllers;

// for Current showing viewController
UIViewController *vCtrl = [viewCtrl objectAtIndex:[viewCtrl count]-1];
if([vCtrl isKindOfClass:[<YourControllerClass> class]]) 
{
 //Your code
} 
于 2013-10-16T04:17:59.553 回答