2012-08-04 71 views
-1

我這樣做是爲了改變按鈕的狀態。這是一個書籤樣式按鈕。如果用戶想爲詳細視圖添加書籤,他可以點擊一個明星。我想在根視圖中找回信息。如何使用NSUserDefaults從detailview返回到tableview的按鈕狀態

這裏是我的detailview.m

- (IBAction)saveRow 
{ 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *save = cellNumber; 

if ([buttonSave.titleLabel.text isEqualToString:@"Sync off"]) { 
    [prefs setValue:@"YES" forKey:save]; 
    [buttonSave setTitle:@"Sync on" forState:UIControlStateNormal]; 
    [buttonSave setBackgroundImage:[UIImage imageNamed:@"clicked.png"] forState:UIControlStateNormal]; 
} 
else { 
    [prefs setValue:@"NO" forKey:save]; 
    [buttonSave setTitle:@"Sync off" forState:UIControlStateNormal]; 
    [buttonSave setBackgroundImage:[UIImage imageNamed:@"notclicked.gif"] forState:UIControlStateNormal]; 
} 

// save 
[prefs synchronize]; 
} 



#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

if ([[NSUserDefaults standardUserDefaults] boolForKey:cellNumber]) 
{ 
    [buttonSave setTitle:@"Sync on" forState:UIControlStateNormal]; 
    [buttonSave setBackgroundImage:[UIImage imageNamed:@"clicked.png"] forState:UIControlStateNormal]; 
} 
else { 
    [buttonSave setTitle:@"Sync off" forState:UIControlStateNormal]; 
    [buttonSave setBackgroundImage:[UIImage imageNamed:@"notclicked.gif"] forState:UIControlStateNormal]; 
} 

代碼,但在rootview,我不知道該怎麼做才能做同樣的事情。 rootview是一個tableview。

任何想法?

回答

0

U可以在DetailViewController中定義RootViewController將實施的委託。

@protocol DetailViewControllerDelegate <NSObject> 
- (void)detailViewController:(DetailViewController *)controller didBookmarkSomthing:(Something *)something 

@end 

然後RootViewController會實現這個方法,並從something他會知道更新UI。

話雖如此,我通常在模型層做這種事情 - 改變模型的狀態,然後告訴誰對這種改變感興趣。
例如,假設你有書籍的表格視圖 - 所以我的模型是Book對象的列表。
現在,當用戶點擊其中一本書時,我會推送一個詳細視圖控制器,我們稱其爲BookDetailViewController,顯示該書的信息。
當我推這個控制器我通過Book對象吧,一般我創建了一個特殊的init方法也得到Book,就像這樣:

- (id)initWithBook:(Book *)aBook 
{ 
    self = [super init]; 
    if (self) { 
     self.book = aBook; 
    } 
    return self; 
} 

現在無論ü在該視圖控制器應感染Book做對象,例如,如果你想啓用用戶書籤動作(只是一個例子..),那麼你需要添加一個isBookmarked屬性Book對象告訴你,如果一本書是書籤或不。
然後,當用戶按在BookDetailViewController變化書籤按鈕的模型,以及 - self.book.isBookmarked = YES;

現在你的模型改變和u需要更新;誰想要知道這個變化,我喜歡一個通知要做到這一點。
例如,Book對象將定義BookDidChangedBookmarkStateNotification,並在書籤狀態更改時發佈此通知。
您的RootViewController將偵聽此通知並處理uI更改。

+0

哇,好的..非常感謝你的回答和很好的解釋。我想我需要1周的時間來學習所有這些新的表達。所以我必須將一個協議放在我的detailView中,並在我的根視圖中使用init方法?所以代表是關鍵.. – hhd59 2012-08-04 23:20:14

+0

關鍵是管理你的模型中的這種狀態,通常它是不夠的告訴你的RootViewController有關的變化(你的情況「現在是書籤」),所以它可以更新UI。你需要更新你的模型,然後你的模型應該用委託或通知來更新RootViewController。如果你想要我的建議,花點時間學習這些重要的模式,然後回過頭來寫下你的代碼,那將會更加簡單... – Eyal 2012-08-04 23:37:59

+0

我會按照你的建議,這似乎太重要,不理解它!謝謝! – hhd59 2012-08-04 23:46:45

相關問題