如何保存已添加NSUserDefaults的子视图?

时间:2012-12-19 16:08:23

标签: iphone objective-c ios cocoa-touch nsuserdefaults

我正在使用书籍应用程序,我想使用页面标记来帮助用户记住他停止阅读的位置。所以我添加了一个带图像的条形按钮(“mark.png”)。在点击章节视图时,标记视图将添加到章节视图中,如果再次点击该标记视图,则标记将从superView中删除。我正在使用此代码:

- (void)showMark {
    if (![markView superView]) {
       [chapterOne addSubView:markView];
    }
    else {
       [markView removeFromSuperView];
    }
}

它工作正常但是我一直退出应用并再次重新运行标记视图已经消失,那么我该如何保留它? 我发现一些论坛讨论NSUserDefaults来保存动作,但我真的不知道如何将它与我的代码一起使用。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您无法使用NSUserDefaults保存整个视图,但您可以保存有助于确定书签设置位置的参数。

例如,如果您使用页码基于书签,则可以在用户离开视图控制器时将页面保存到NSUserDefaults。

示例:

[[NSUserDefaults standardUserDefaults] setInteger:23 forKey:@"bookMarkPage"];
[[NSUserDefaults standardUserDefaults] synchronize];

当用户返回视图控制器时,您可以检查是否有书签:

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"bookMarkPage"] != nil) {
    int pageNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"bookMarkPage"];
    [self setBookmarkForPage:pageNumber];
}

可能的书签构造方法:

- (void) setBookmarkForPage:(Int)pageNumber {
    // run through the logic of placing the bookmark on the correct page
}

您可以使用所需的任何参数来确定书签的放置位置。当用户最初放置书签时,您使用哪些参数来确定书签的放置位置?尝试在用户首次放置书签时使用相同的逻辑。

答案 1 :(得分:2)

我不知道你想要保存什么,但你可以使用NSUserDefaults来获取任何类型的数据,如下所示:

[[NSUserDefaults standardUserDefaults] setInteger:123 forKey:@"CurrentPageNumber"];

设置完所需的所有值后,保存它们:

[[NSUserDefaults standardUserDefaults] synchronize];

然后,当应用程序打开时,检查是否已设置该值。如果它是你的标记。

if ([defaults valueForKey:@"CurrentPageNumber"] != nil) {
    int pageNumber = [defaults valueForKey:@"CurrentPageNumber"]

    if (pageNumber == 1) {
        [chapterOne addSubView:markView];
    }
    else {
        [markView removeFromSuperView];
    }
}

答案 2 :(得分:0)

其他答案说明了解决问题的好方法。为了澄清,NSUserDefaults不支持UIView或任何衍生产品。 NSUserDefaults只允许原始对象类型(NSString, NSNumber, NSArray, and NSDictionary)。可能有一两个我错过了。但UIViewUIViewController对象类型无法保存在NSUserDefaults