我有两个视图控制器:应用程序加载时看到的表视图和选择单元格时推送的控制器。我在其中一个表视图声明中有一个变量,当它被推送时需要传递给另一个视图控制器。变量为每个表格单元格提供一个数字([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;
}
答案 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:
通知。
更新:回应澄清请求。
假设我有两个课程Foo
和Bar
。每当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方法,分别称为x
和setX
。如果您已完成此操作,则可以使用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的开发者网站获得。它们是键值编码编程指南和键值观察编程指南。