19952
UITextViewをattributedTextで部分的に色付けが可能なメモ帳を作成しているのですが、  
attributedTextで加えた変更をUserDefaultに保存したいのですが、ご教授いただけると助かります

```

    -(void)redChengeButton:(id) sender{
        NSLog(@"ボタンが押されました");
        NSRange selectedRange = self->tv.selectedRange;
        // 1文字以上を選択していたら
        if (selectedRange.length > 0) {
            NSLog(@"called if文");
            // attributedStringを取得して、Mutableにコピー。
            NSMutableAttributedString *theText = [tv.attributedText mutableCopy];
            // 選択部分だけ文字色を赤に変える。
            [theText addAttribute:NSForegroundColorAttributeName value: UIColor.redColor range:selectedRange ];
    
            NSLog(@"my range is %@", NSStringFromRange(selectedRange));
            // 変更を加えたattributedStringを戻す。
            tv.attributedText = theText;
    
            UIFont *font = self->tv.font; // フォントを取得
            self->tv.typingAttributes = @{NSForegroundColorAttributeName: UIColor.blackColor,
                                          NSFontAttributeName: font};
        }
    
    }
    
```

  

```

    //これで保存しようとするとエラー
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setValue:tv.attributedText forKey:@"tv"];
    
    //これだと色の変更が保存されない
     NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setValue:tv.text forKey:@"tv"];
    
```
CC BY-SA 3.0
2015-12-13T14:36:05.967
19946
2015-12-14T00:55:54.990
2015-12-13T22:19:56.853
7362
12902
question
ios objective-c
attributedTextでの変更点をNSUserDefaultで保存したい。
[NSUserDefaults Class
Reference](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/)

ここから引用：

> The NSUserDefaults class provides convenience methods for accessing  
>  common types such as floats, doubles, integers, Booleans, and URLs. A  
>  default object must be a property list, that is, an instance of (or  
>  for collections a combination of instances of): NSData, NSString,  
>  NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any  
>  other type of object, you should typically archive it to create an  
>  instance of NSData. For more details, see Preferences and Settings  
>  Programming Guide.

ということで、`NSAttributedString`は、`NSData`に変換してから、`NSUserDefaults`に保存してください。

_NSDataに変換して、NSUserDefaultsに書き込み_

```

    // attributedTextは、NSAttributedStringのインスタンス。
    NSData *textData = [attributedText dataFromRange: NSMakeRange(0, attributedText.length) documentAttributes: @{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType} error: NULL];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject: textData forKey: @"TextData"];
    [defaults synchronize];
    
```

_NSUserDefaultsから読み出して、NSDataから変換_

```

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *textData = [defaults dataForKey: @"TextData"];
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithData: textData options:@{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType} documentAttributes: NULL error: NULL];
    
```

※Objective-C
1.0以来のクラシックな書式をお使いの方に対して、2.0のモダンな書式を使うのはどうかと思いましたが、ご容赦ください。例外発生などの対処はしておりませんので、適宜対応してください。
CC BY-SA 3.0
2015-12-14T00:55:54.990
19952
2015-12-14T00:55:54.990
7362
19946
answer