如果使用我的课是正确的,那就很困惑

时间:2013-07-26 12:46:26

标签: ios objective-c class nsobject

任何人都可以指导我完成项目的过程。我有太多的教程,我不确定再采取哪条路线。所以我有两个UITextField s接受一个字符串。具体如下:

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];
}

2 个答案:

答案 0 :(得分:1)

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

尝试减少您的代码。它不一定非常冗长。另外,我认为你需要一个简单的水果词典数组,而不是嵌套的词典。

-(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];
}

答案 1 :(得分:0)

UITextField是UIView的子类,因此您应该覆盖方法

- (id)initWithFrame:(CGRect)frame 

而不是

- (id)init

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

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

- (void)awakeFromNib {

    [super awakeFromNib];

    // customization here
}

或在拥有视图的viewcontroller中的viewDidLoad回调中或之后,设置textField