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,并通过创建从界面构建器到我的代码的连接来手动完成,但实际上我有数千个偏好,我必须建立连接并保存。

所以我的目标是创建一个类,我说类似......

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

我的计划是在界面生成器中为每个元素设置标识符属性。然后要从中获取一个值,我将在视图中的每个子视图中进行一个函数循环,直到它找到一个与我请求的标识符匹配的标识符,我将检查它的类类型以创建一个临时变量并使用该临时变量类 tpye 从中获取价值。

例如,假设我的 NSView 中的对象是一个 NSTextView,其 stringValue 为“hello world”

使用 NSViews 方法 subViews 我返回一个包含所有子视图的数组,其中包括上面提到的 NSTextView。

我可以使用 NSObject className 中的函数将类名返回为@“NSTextView”。

那我应该可以说... 两件事之一

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

或者...

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

编译但我得到一个警告(不兼容的指针类型初始化 'NSTextView *__strong' 与类型的表达式'NSView *const __strong')

当我运行程序并尝试运行我的例程时,它崩溃并说 -[NSTextField setString:]:unrecognized selector sent to an instance 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,并通过创建从界面构建器到我的代码的连接来手动完成,但实际上我有数千个偏好,我必须建立连接并保存。

所以我的目标是创建一个类,我说类似......

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

我的计划是在界面生成器中为每个元素设置标识符属性。然后要从中获取一个值,我将在视图中的每个子视图中进行一个函数循环,直到它找到一个与我请求的标识符匹配的标识符,我将检查它的类类型以创建一个临时变量并使用该临时变量类 tpye 从中获取价值。

例如,假设我的 NSView 中的对象是一个 NSTextView,其 stringValue 为“hello world”

使用 NSViews 方法 subViews 我返回一个包含所有子视图的数组,其中包括上面提到的 NSTextView。

我可以使用 NSObject className 中的函数将类名返回为@“NSTextView”。

那我应该可以说... 两件事之一

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

或者...

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

编译但我得到一个警告(不兼容的指针类型初始化 'NSTextView *__strong' 与类型的表达式'NSView *const __strong')

当我运行程序并尝试运行我的例程时,它崩溃并说 -[NSTextField setString:]:unrecognized selector sent to an instance 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 中犯了绑定错误。

文本字段响应 setStringValue: ,而不是 setString: 。

一些技巧

  • 您可以测试对象的类归属;
  • 如果您确定指针指向某个类的对象,则可以强制转换该指针。在您的情况下,您将进行向下转换(从基类到子类)。

所以你会做这样的事情:

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 回答