1

ここに質問があります。うまくいけば簡単に答えることができます。

ビューの配列を指定して、その中のすべての要素を保存し、それらを読み戻すことができるクラスを作成しています。NSArchiverクラスを使用して保存を機能させましたが、読み取り部分は機能しませんでした。

@interface preferences : NSObject

- (void)savePreferences;
- (void)readPreferences;

@property (strong) NSMutableArray *theViews;

@end
 #import "preferences.h"

@implementation preferences
- (id)init {
    self = [super init];
    if (self) {
        _theViews = [[NSMutableArray alloc]init];
    }
    return self;
}

- (void)savePreferences{
    NSLog(@"Saving Preferences...");
    [NSKeyedArchiver archiveRootObject:_theViews toFile:@"preferences.xml"];
}

- (void)readPreferences{
    NSLog(@"Reading Preferences...");
    _theViews = [NSKeyedUnarchiver unarchiveObjectWithFile:@"preferences.xml"];
}

@end

アイデアは、設定を保存して後で思い出す簡単な方法が欲しいということです。私はNS_UserDefaultsを知っており、Interface Builderからコードへの接続を作成して手動で実行していますが、接続を作成して保存する必要がある文字通り何千もの設定があります。

だから私の目標は、私が次のようなことを言うクラスを作成することです...

[preferences savePreferencesForViews:ArrayOfViews];//For Saving
[preferences readPreferencesForViews:ArrayOfViews];//For Reading

私の計画は、すべての要素のインターフェイスビルダーで識別子属性を設定することでした。次に、値を取得するために、ビュー内のすべてのサブビューを、要求したものと一致する識別子が見つかるまで関数サイクルを実行し、クラスタイプを調べてその一時変数を作成し、その一時変数を使用します。クラスtpyeを使用して、値を取得します。

たとえば、NSView内のオブジェクトが「helloworld」のstringValueを持つNSTextViewであったとします。

NSViewsメソッドsubViewsを使用して、すべてのサブビューの配列を返します。これには、上記のNSTextViewが含まれます。

NSObject classNameの関数を使用して、クラス名を@"NSTextView"として返すことができます。

それなら私は言うことができるはずです...2つのことのうちの1つ

   [subView setString:@"hey"];//compile error

また...

 NSTextView *temp = subView;
    [temp setString:@"test"];

コンパイルされますが、警告が表示されます('NSTextView *__strong'を'NSView* const __strong'型の式で初期化する互換性のないポインター型)

プログラムを実行してルーチンを実行しようとすると、クラッシュして「-[NSTextFieldsetString:]:unrecognizedセレクターがインスタンス0X101a0cfe0に送信されました」と表示されます。

どうしたらいいかわからないので、助けていただければ幸いです!

こんにちはみんな。ここに質問があります。うまくいけば簡単に答えることができます。

ビューの配列を指定して、その中のすべての要素を保存し、それらを読み戻すことができるクラスを作成しています。NSArchiverクラスを使用して保存を機能させましたが、読み取り部分は機能しませんでした。

@interface preferences : NSObject

- (void)savePreferences;
- (void)readPreferences;

@property (strong) NSMutableArray *theViews;

@end
 #import "preferences.h"

@implementation preferences
- (id)init {
    self = [super init];
    if (self) {
        _theViews = [[NSMutableArray alloc]init];
    }
    return self;
}

- (void)savePreferences{
    NSLog(@"Saving Preferences...");
    [NSKeyedArchiver archiveRootObject:_theViews toFile:@"preferences.xml"];
}

- (void)readPreferences{
    NSLog(@"Reading Preferences...");
    _theViews = [NSKeyedUnarchiver unarchiveObjectWithFile:@"preferences.xml"];
}

@end

アイデアは、設定を保存して後で思い出す簡単な方法が欲しいということです。私はNS_UserDefaultsを知っており、Interface Builderからコードへの接続を作成して手動で実行していますが、接続を作成して保存する必要がある文字通り何千もの設定があります。

だから私の目標は、私が次のようなことを言うクラスを作成することです...

[preferences savePreferencesForViews:ArrayOfViews];//For Saving
[preferences readPreferencesForViews:ArrayOfViews];//For Reading

私の計画は、すべての要素のインターフェイスビルダーで識別子属性を設定することでした。次に、値を取得するために、ビュー内のすべてのサブビューを、要求したものと一致する識別子が見つかるまで関数サイクルを実行し、クラスタイプを調べてその一時変数を作成し、その一時変数を使用します。クラスtpyeを使用して、値を取得します。

たとえば、NSView内のオブジェクトが「helloworld」のstringValueを持つNSTextViewであったとします。

NSViewsメソッドsubViewsを使用して、すべてのサブビューの配列を返します。これには、上記のNSTextViewが含まれます。

NSObject classNameの関数を使用して、クラス名を@"NSTextView"として返すことができます。

それなら私は言うことができるはずです...2つのことのうちの1つ

   [subView setString:@"hey"];//compile error

また...

 NSTextView *temp = subView;
    [temp setString:@"test"];

コンパイルされますが、警告が表示されます('NSTextView *__strong'を'NSView* const __strong'型の式で初期化する互換性のないポインター型)

プログラムを実行してルーチンを実行しようとすると、クラッシュして「-[NSTextFieldsetString:]:unrecognizedセレクターがインスタンス0X101a0cfe0に送信されました」と表示されます。

どうしたらいいかわからないので、助けていただければ幸いです!

インターフェイスの私の実装は以下のとおりです

@implementation appController

- (IBAction)savePreferences:(id)sender {
    NSLog(@"Save Button Pressed");

    //Create an instance of the preference class.
    preferences *PreferencesObject = [[preferences alloc]init];

    //Add the views we want to sve to the PreferenceObject.
    [[PreferencesObject theViews]addObject:_preferenceView];

    //Save the actual preferences now.
    [PreferencesObject savePreferences];

}
- (IBAction)loadPreferences:(id)sender {

    //Create an instance of the preference class.
    preferences __strong *PreferencesObject = [[preferences alloc]init];

    //Read the preferences into it's internal array.
    [PreferencesObject readPreferences];

    for(NSView __strong *view in [PreferencesObject theViews]){
        if([[view identifier]isEqualTo:[_preferenceView identifier]]){
            NSLog(@"View Match Found For PreferenceView, Setting...");


            for(NSView *subView in [_preferenceView subviews]){
                if([[subView identifier]isEqualTo:@"name"]){
                    NSLog(@"Attempting to set value of name control");
                    NSTextView *temp = subView;
                    [temp setString:@"test"];
                }
            }


        }
    }


}
@end
4

1 に答える 1

1

ビュー配列にテキストビューではなくテキストフィールドが含まれているようです。IBでバインディングエラーが発生した可能性があります。

テキストフィールドは、setString:ではなくsetStringValue:に応答します。

いくつかのヒント

  • オブジェクトに属するクラスをテストできます。
  • ポインターが特定のクラスのオブジェクトを指していることが確実であれば、ポインターをキャストできます。あなたの場合、ダウンキャスト(基本クラスからサブクラスへ)を行います。

したがって、次のようなことを行います。

if ([ subview isKindOfClass: [NSTextView class]]) // until you fix that binding error or whatever, it will return NO
{
    NSTextView* temp= (NSTextView*) subview;
    [ temp setString: @"temp" ];
}
于 2013-01-14T02:34:33.863 に答える