一般来说,如果您希望一个对象根据其现有属性实例变量存储/返回它通常不存储的信息,您可以使用 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
上面的代码中,我们正在使用运行时拼凑代码来实现它。使用控制器的控制器更加健壮,并且该概念可以涵盖大多数项目的许多其他有用任务。这个想法是对修改关闭但对扩展开放的设计代码。