如何使用NSUserDefaults从detailview返回按钮状态到tableview

时间:2012-08-04 18:23:42

标签: objective-c ios xcode delegates

我这样做是为了改变一个按钮的状态。这是一个书签样式按钮。如果用户想要为详细视图添加书签,则可以单击星标。我想在根视图中获取信息。

这是我的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。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以在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对象,例如,如果你想让用户书签一个书籍动作(只是一个例子..)那么你需要添加一个{{1}对isBookmarked对象的属性告诉你书是否是书签  然后,当用户按下Book中的书签按钮时,也可以更改模型 - BookDetailViewController

现在您的模型已更改,您需要更新有关此更改的人员,我希望通过通知执行此操作。
例如,Book对象将定义self.book.isBookmarked = YES;,并在书签状态更改时发布此通知 您的BookDidChangedBookmarkStateNotification会收听此通知并处理uI更改。