0

2つのビューコントローラーがあります。アプリが読み込まれたときに表示されるテーブルビューと、セルが選択されたときにプッシュされるコントローラーです。テーブルビュー宣言の1つに変数があり、プッシュされたときに他のビューコントローラーに転送する必要があります。変数は各テーブルセルに番号([objectAtIndex row] + 1)を与え、上のセルが1になるようにします。 。次は2.ectです。私はその変数が必要なので、ViewControllerでさまざまに使用されます。これどうやってするの?ありがとうございました。

最初の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;  
}
4

2 に答える 2

4

多くの方法がありますが、2つの簡単な方法がここにあります...

これの1つの簡単な方法

ユーザーデフォルトで値を保存

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

次のコントローラーで値を取得し、viewWillAppearに書き込みます

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

2番目の方法は

   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あるコントローラークラスから別のコントローラークラスへのKey-Valueコーディング/監視を使用します。KVCに準拠している場合UITableViewCellは、そのプロパティにオブザーバーを登録することでKVOを無料で入手できtextます(私はiOSではなくMacOSを使用しているため、これが当てはまるかどうかはわかりません)。そうでない場合は、テキストを設定する前に[self willChangeValueForKey:]、セルのテキストをシャドウイングするいくつかのキープロパティを呼び出し、その後でを呼び出します[self didChangeValueForKey:]。他のクラスが最初のコントローラークラスにオブザーバーを設定していると仮定すると、observeValueForKeyPath:通知が届きます。

更新:説明の要求に応じて。

私には2つのクラスがFooありBarます。Fooプロパティ(つまりインスタンス変数)がBar変更されたときに通知を受け取りたいです。適切な方法で記述されている場合Barは、Key-Valueコーディングに準拠します。これは、そのプロパティが、エンコードされた文字列表現である、いわゆるキーパスを介してアクセスできることを意味します。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。これを行った場合は、xKVCを使用してアクセスできます。クラスは次のようなことを行うことができます。

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

KVCに準拠しているクラスは、Key-Value監視(KVO)に準拠している可能性があるため、これは目的に役立ちます。KVOを実装するには、監視対象addObserver:forKeyPath:options:context:のオブジェクトにメソッドを呼び出し、監視を実行するオブジェクトにメソッドを実装しobserveValueforKeyPath:ofObject:change:context:ます。したがって、クラスのインスタンスが変更のインスタンスのプロパティFooごとに通知されるようにするには、次のようなことを行うことができます。xBar

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変更するたびに、のメソッドに送信されます。KVOをトリガーするには、setterメソッドを使用する必要があることに注意してください。インスタンスメソッド内で単に言うだけでは十分ではありません。x[self setX:<new value>]observeValueForKeyPath:foox=2;

NSObjectこれらはすべて、 (またはiOSと同等の)実装の一部として無料で提供されます。ドキュメントはAppleの開発者サイトから入手できます。これらは、KeyValueCodingプログラミングガイドとKeyValueObservingプログラミングガイドです。

于 2012-07-26T21:30:27.513 に答える