0

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

这是第一个视图控制器中的代码:

- (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;  
}
4

2 回答 2

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]; 
于 2012-07-27T10:01:30.647 回答
1

textLabel从一个控制器类到另一个控制器类使用键值编码/观察。如果UITableViewCell符合 KVC,那么您可以通过在其属性上注册观察者来免费获得 KVO text(我使用的是 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。如果你已经这样做了,那么x就可以使用 KVC 访问。一个类可以执行以下操作:

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 的开发者网站获得。它们是键值编码编程指南和键值观察编程指南。

于 2012-07-26T21:30:27.513 回答