2012-07-26 64 views
0

我有兩個視圖控制器:應用程序加載時看到的表視圖和選擇單元格時被按下的控制器。我有一個表視圖聲明中的變量,當它被push時,需要傳遞給另一個視圖控制器。變量給每個表格單元一個數字([objectAtIndex row] + 1),以使頂部的單元格爲1 。接下來是2.ect。我需要在視圖控制器中使用各種各樣的變量。我怎樣才能做到這一點?謝謝。當視圖控制器被按下時保存變量

這裏是第一視圖控制器代碼:

- (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

有很多方法,但兩種簡單的方法是在這裏...

在此

保存在用戶的默認值

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

檢索下一個控制器值

一個簡單的方法,寫in 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

使用鍵 - 值編碼/從一個控制器類,其他各地textLabel觀察。如果UITableViewCell符合KVC標準,那麼您可以通過在其text屬性(我使用MacOS,而不是iOS,因此我不知道是否屬於這種情況)上註冊觀察員來獲得KVO。如果不是這樣,在設置文本調用[self willChangeValueForKey:]以獲得一些關鍵單元文本的關鍵屬性之後,再調用[self didChangeValueForKey:]。假設你的其他班級在第一個控制器類上設置了一個觀察者,它將得到一個observeValueForKeyPath:通知。

更新:迴應澄清請求。

說我有兩個類FooBar。每當Bar的屬性(即實例變量)發生更改時,我都會通知Foo。如果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類的實例,每次都被告知Bar變化實例的x屬性,你可以這樣做以下:

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改變使用[self setX:<new value>]消息其x屬性將被髮送到的fooobserveValueForKeyPath:方法。請注意,爲了觸發KVO,必須使用setter方法。在實例方法中簡單地說x=2;是不夠的。

所有這些都是作爲NSObject(或iOS等價物)實現的一部分免費提供給您的。該文檔可從Apple的開發人員網站獲得。它們是關鍵值編程編程指南和關鍵值觀察編程指南。

+0

對不起@大衛,但林很新的IOS,我不知道是什麼KVC或志願是。你能否給我一個更具體的例子? – user1438042 2012-07-26 22:58:10

相關問題