使用UINavigationController决定当前显示的视图

时间:2013-10-16 03:47:59

标签: ios objective-c uiviewcontroller uinavigationcontroller

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

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

如果有人知道怎么做,我会很感激帮助:)

3 个答案:

答案 0 :(得分:0)

通常,如果您希望对象存储/返回基于其现有属性实例变量通常不存储的信息,则可以使用objective-c的运行时object association

所以请考虑以下类别:

#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..

这是快速的解决方案..但如果它是我自己的代码..我会使用mediator pattern ..基本上创建一个控制器控制器(让我们只是称它为控制器),并使其成为一个singelton。这个对象将保持中间信息,例如哪个viewcontroller做了什么,并在必要时返回该信息.. UINavigationBar在上面的代码中执行此操作,但我们使用运行时拼凑代码实现它。使用控制器的控制器更加强大,概念可以涵盖大多数项目中出现的许多其他有用任务。这个想法是设计代码,它是关闭修改但开放的扩展。

答案 1 :(得分: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
} 

答案 2 :(得分:0)

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