按下视图控制器时保存变量

时间:2012-07-26 21:15:25

标签: objective-c xcode cocoa-touch

我有两个视图控制器:应用程序加载时看到的表视图和选择单元格时推送的控制器。我在其中一个表视图声明中有一个变量,当它被推送时需要传递给另一个视图控制器。变量为每个表格单元格提供一个数字([objectAtIndex row] + 1),以便顶部的单元格为1接下来是2.等。我需要在视图控制器中使用的变量。我怎样才能做到这一点?谢谢。

以下是第一个View控制器中的代码:

- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

UITableViewCell *cell = [atableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:@"UITableViewCell"];
}

BNRItem *p = [[[BNRItemStore sharedStore] allItems] objectAtIndex:[indexPath row]];


//Variable that I need in the other view:
NSString *string = [NSString stringWithFormat:@"%d. %@",[indexPath row] + 1, p];


[[cell textLabel] setText:string];

 return cell;  
}

2 个答案:

答案 0 :(得分:4)

有很多方法,但这里有两种简单的方法......

这个

中的一个简单方法

在用户默认值中保存值

[[NSUserDefaults standardUserDefaults] setValue:@"Your Value" forKey:@"Your Key"];

在下一个控制器中检索值,在viewWillAppear中写入

[[NSUserDefaults standardUserDefaults] objectForKey:@"Your Key"];

第二种方式是

   MessageBoxViewController *msgBoxController = [[MessageBoxViewController alloc]initWithNibName:@"MessageBoxViewController" bundle:nil];

[msgBoxController setReceverArray:urArray]; 

[self.navigationController pushViewController:msgBoxController animated:YES];
[msgBoxController release]; 

答案 1 :(得分:1)

使用从一个控制器类到另一个控制器类的textLabel周围的键值编码/观察。如果UITableViewCell符合KVC,那么您可以通过在text属性上注册观察者来免费获得KVO(我使用MacOS,而不是iOS,所以我不知道是否是这种情况) 。如果没有,请在为某些关键属性设置文本调用[self willChangeValueForKey:]之前调用单元格的文本,然后调用[self didChangeValueForKey:]。假设您的其他类在第一个控制器类上设置了一个观察者,它将收到observeValueForKeyPath:通知。

更新:回应澄清请求。

假设我有两个课程FooBar。每当Foo的属性(即实例变量)发生变化时,我都希望Bar得到通知。如果Bar以适当的方式编写,则它将符合键值编码。这意味着可以通过所谓的密钥路径访问其属性,该密钥路径是编码的字符串表示。让我们说Bar声明如下:

·H

@interface Bar : public NSObject
@property (assign,readwrite) NSInteger x;
@end

的.m

#import "Bar.h"
@implementation Bar
@synthesize x;

...

@end

@property@synthesize声明的组合将自动生成一对getter和setter方法,分别称为xsetX。如果您已完成此操作,则可以使用KVC访问x。一个类可以执行以下操作:

Bar *bar=[[Bar alloc] init];
NSInteger barX=[bar valueForKey:@"x"];
[bar setValue:2 forKeyPath:@"x"]; // really needs an NSNumber wrapper object   

出于您的目的,这变得有用,因为符合KVC的类可以与键值观察(KVO)兼容。要实现KVO,可以在要观察的对象上调用addObserver:forKeyPath:options:context:方法,并在要进行观察的对象中实现observeValueforKeyPath:ofObject:change:context:方法。因此,对于每次Foo实例的x属性发生更改时通知的类Bar的实例,您可以执行以下操作:

Foo *foo=[[Foo alloc] init];
Bar *bar=[[Bar alloc] init];

[bar addObserver:foo forKeyPath:@"x" options:NSKeyValueObservingOptionNew
   context:NULL];

并且在Foo类的实现中,您将覆盖观察者方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
   change:(NSDictionary *)change context:(void *)context
{
   if[keyPath isEqualToString:@"x"]
      {
      // extract new value from change dictionary
      }
}

每次bar使用x更改其[self setX:<new value>]媒体资源时,都会向observeValueForKeyPath: foo方法发送一条消息。请注意,为了触发KVO,必须使用setter方法。仅仅在实例方法中说x=2;是不够的。

所有这些都是作为NSObject(或iOS等效)实现的一部分免费提供给您的。这些文档可从Apple的开发者网站获得。它们是键值编码编程指南和键值观察编程指南。