0

任何人都可以引导我完成我的项目过程。我有太多的教程,我真的不知道该走哪条路了。所以我有两个UITextFields 可以接受一个字符串。这些如下:

UITextField *fruitNameField;
UITextField *fruitDescriptionField;

在我ViewController的里面,代码是这样的

NSString *fruitName = [[NSString alloc] initWithString:[fruitNameField text]];
NSString *fruitDescription = [[NSString alloc] initWithString:[fruitDescriptionField text]];
NSLog(@"Fruit: %@, Description: %@", fruitName, fruitDescription);

正如您在上面看到的,它没有使用我的Fruit课程。

所以这是我的Fruit实现

- (id)init
{
    return [self initWithName:@"N/A"
                  description:@"N/A"
                     priority:2];
}

- (id)initWithName:(NSString *)name description:(NSString *)desc priority:(int)prio
{
    self = [super init];
    if (self) {
        [self setFruitName:name];
        [self setFruitDescription:desc];
        [self setFruitPriority:prio];
    }

    return self;
}

#pragma mark -
#pragma mark Description

- (NSString *)description
{
    return [[NSString alloc] initWithFormat:@"[%d] %@: %@", fruitPriority, fruitName, fruitDescription];
}

问题是,无论何时输入我的字符串,我都需要使用Fruit我创建的类ViewController吗?

顺便说一句,这是我ViewController

- (IBAction)writeToPlist:(id)sender
{
    NSLog(@"writeToPlist");

    NSString *fruitName = [[NSString alloc] initWithString:[fruitNameField text]];
    NSString *fruitDescription = [[NSString alloc] initWithString:[fruitDescriptionField text]];

    NSDictionary *fruitDetail = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:fruitName, fruitDescription, nil]
                                                            forKeys:[NSArray arrayWithObjects:@"Fruit", @"Description", nil]];

    NSMutableArray *fruitPlist = [[NSMutableArray alloc] initWithContentsOfFile:[self filePath]];

    if (fruitPlist == nil) {
        fruitPlist = [[NSMutableArray alloc] init];
    }

    NSMutableDictionary *fruitDictionary = [[NSMutableDictionary alloc] init];

    [fruitDictionary setObject:fruitDetail forKey:fruitName];

    [fruitPlist addObject:fruitDictionary];
    [fruitPlist writeToFile:[self filePath] atomically:YES];

    [[self presentingViewController] dismissViewControllerAnimated:YES
                                                        completion:nil];
}
4

2 回答 2

1

你可以保留你的 Fruit 课程。它是一个简单数据结构的包装器,它也可以包含在 NSDictionary 中,但我认为尝试在自己的代码中创建具体对象是一个好习惯。如果你不夸大它,它可以使代码更具可读性。

尝试减少您的代码。它不必如此冗长。另外,我认为您希望 plist 中有一个简单的水果字典数组,而不是嵌套字典。

-(void)writeToPlist {
  NSArray *fruits = @[@{
                       @"name":nameTextField.text,
                       @"desc":descriptionTextField.text }];
  [fruits writeToFile:[self filePath] atomically:YES];
}

请注意,这不使用您的水果类。你直接从文本字段到 plist,所以没有必要。您还可以编写一个将水果写入 plist 的方法。

-(void)writeToPlist:(Fruit*)fruit {
  NSArray *fruits = @[ @{ @"name":fruit.name, @"desc":fruit.desc } ];
  [fruits writeToFile:[self filePath] atomically:YES];
}
于 2013-07-26T13:04:53.810 回答
0

UITextField 是 UIView 的子类,因此您应该重写该方法

- (id)initWithFrame:(CGRect)frame 

并不是

- (id)init

我看到一个 IBAction ......你的 UITextField 是由 nib 文件初始化的吗?

在这种情况下,您必须以这种方式覆盖 awakeFromNib 方法:

- (void)awakeFromNib {

    [super awakeFromNib];

    // customization here
}

或在拥有视图的视图控制器中的 viewDidLoad 回调中或之后,设置您的 textField

于 2013-07-26T13:04:55.997 回答