Проблема с загрузкой вложенного списка в сборщик - PullRequest
1 голос
/ 08 декабря 2011

Я довольно новичок в Objective C, и у меня возникают проблемы с чтением значений из списка в набор NSArrays.Я пытался сослаться на этот вопрос , но безуспешно.

У меня есть 3 массива, которые я пытаюсь загрузить в свой сборщик.Я хочу загрузить 3 массива: преобразования массивов, typesFrom и typesTo.typesFrom и typesTo содержат одинаковые значения, но меняются в зависимости от типа преобразования.

В настоящее время средство выбора будет загружаться с 3 столбцами, но без строк. Мне кажется, что, возможно, существует простое решение, но я пытался часами и, похоже, не могу его найти.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    // Grab information from the plist
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *plistPath = [bundle 
        pathForResource:@"conversions" 
        ofType:@"plist"
    ];
    NSDictionary *dictionary = [[NSDictionary alloc]
        initWithContentsOfFile:plistPath
    ];

    // Store conversions
    for(NSDictionary *dict in [dictionary valueForKey:@"Conversions"]) {
        [self.conversions arrayByAddingObject:[dict valueForKey:@"name"]];
        [self.categories arrayByAddingObject:[dict valueForKey:@"conversions"]];
    }
    [dictionary release];

    [self loadIntoPicker:0];
}

- (void)loadIntoPicker:(NSInteger)index {       
        // Set the current category
        NSArray *category = [self.categories objectAtIndex:index];

        for (NSDictionary *conversion in category) {
            [self.typesFrom arrayByAddingObject:[conversion valueForKey:@"type"]];
            [self.typesTo arrayByAddingObject:[conversion valueForKey:@"type"]];
            [self.descriptions arrayByAddingObject:[conversion valueForKey:@"description"]];
            [self.multipliers arrayByAddingObject:[conversion valueForKey:@"multiplier"]];
        }

        [picker selectRow:0 inComponent:1 animated:YES];
        [picker selectRow:0 inComponent:2 animated:YES];
        [picker reloadComponent:1];
        [picker reloadComponent:2];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 3;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if ( component == kCategoryComponent )
        return [self.conversions count];
    else 
        return [self.typesFrom count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if ( component == kCategoryComponent ) 
        return [self.conversions objectAtIndex:row];
    else if ( component == kConvertFromComponent )
        return [self.typesFrom objectAtIndex:row];
    else    
        return [self.typesTo objectAtIndex:row];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if ( component == kCategoryComponent ) {
        if ( row >= 0 )
            [self loadIntoPicker:row];
    }
}

Плист, который я использую:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Conversions</key>
    <array>
        <dict>
            <key>name</key>
            <string>Speed</string>
            <key>conversions</key>
            <array>
                <dict>
                    <key>type</key>
                    <string>mph</string>
                    <key>description</key>
                    <string>mile/hour</string>
                    <key>multiplier</key>
                    <integer>1</integer>
                </dict>
                <dict>
                    <key>type</key>
                    <string>ft/s</string>
                    <key>description</key>
                    <string>foot/second</string>
                    <key>multiplier</key>
                    <real>1.466667</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>km/h</string>
                    <key>description</key>
                    <string>kilometer/hour</string>
                    <key>multiplier</key>
                    <real>1.609344</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>m/s</string>
                    <key>description</key>
                    <string>meter/second</string>
                    <key>multiplier</key>
                    <real>0.44704</real>
                </dict>
            </array>
        </dict>
        <dict>
            <key>name</key>
            <string>Distance</string>
            <key>conversions</key>
            <array>
                <dict>
                    <key>type</key>
                    <string>ft</string>
                    <key>description</key>
                    <string>feet</string>
                    <key>multiplier</key>
                    <integer>1</integer>
                </dict>
                <dict>
                    <key>type</key>
                    <string>yd</string>
                    <key>description</key>
                    <string>yard</string>
                    <key>multiplier</key>
                    <real>0.3333333</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>mi</string>
                    <key>description</key>
                    <string>mile</string>
                    <key>multiplier</key>
                    <real>0.0001894</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>in</string>
                    <key>description</key>
                    <string>inch</string>
                    <key>multiplier</key>
                    <integer>12</integer>
                </dict>
                <dict>
                    <key>type</key>
                    <string>m</string>
                    <key>description</key>
                    <string>meter</string>
                    <key>multiplier</key>
                    <real>0.3048</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>km</string>
                    <key>description</key>
                    <string>kilometer</string>
                    <key>multiplier</key>
                    <real>0.0003048</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>cm</string>
                    <key>description</key>
                    <string>centimeter</string>
                    <key>multiplier</key>
                    <real>30.48</real>
                </dict>
            </array>
        </dict>
        <dict>
            <key>name</key>
            <string>Volume</string>
            <key>conversions</key>
            <array>
                <dict>
                    <key>type</key>
                    <string>ft^3</string>
                    <key>description</key>
                    <string>cubic feet</string>
                    <key>multiplier</key>
                    <integer>1</integer>
                </dict>
                <dict>
                    <key>type</key>
                    <string>liter</string>
                    <key>description</key>
                    <string>liter</string>
                    <key>multiplier</key>
                    <real>28.31685</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>acre ft</string>
                    <key>description</key>
                    <string>acre foot</string>
                    <key>multiplier</key>
                    <real>2.3e-05</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>barrel</string>
                    <key>description</key>
                    <string>barrel [US, liquid]</string>
                    <key>multiplier</key>
                    <real>0.2374768</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>gallon</string>
                    <key>description</key>
                    <string>gallon [US, liquid]</string>
                    <key>multiplier</key>
                    <real>29.92208</real>
                </dict>
                <dict>
                    <key>type</key>
                    <string>quart</string>
                    <key>description</key>
                    <string>quart [US, liquid]</string>
                    <key>multiplier</key>
                    <real>29.92208</real>
                </dict>
            </array>
        </dict>
    </array>
</dict>
</plist>

1 Ответ

1 голос
/ 09 декабря 2011

Похоже, что ваши массивы не были инициализированы или заполнены должным образом.

arrayByAddingObject: возвращает новый массив, содержащий добавленный объект, но вы не используете возвращаемое значение этих операторов.

Если ваши массивы NSMutableArray свойств, попробуйте этот код:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    // Grab information from the plist
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *plistPath = [bundle 
        pathForResource:@"conversions" 
        ofType:@"plist"
    ];
    NSDictionary *dictionary = [[NSDictionary alloc]
        initWithContentsOfFile:plistPath
    ];

    self.conversions = [NSMutableArray arrayWithCapacity:0];
    self.categories = [NSMutableArray arrayWithCapacity:0];

    // Store conversions
    for(NSDictionary *dict in [dictionary valueForKey:@"Conversions"]) {
        [self.conversions addObject:[dict valueForKey:@"name"]];
        [self.categories addObject:[dict valueForKey:@"conversions"]];
    }
    [dictionary release];

    [self loadIntoPicker:0];
}

Если они имеют тип NSArray, вы можете изменить код следующим образом:

   - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.

        // Grab information from the plist
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *plistPath = [bundle 
            pathForResource:@"conversions" 
            ofType:@"plist"
        ];
        NSDictionary *dictionary = [[NSDictionary alloc]
            initWithContentsOfFile:plistPath
        ];

        NSMutableArray *tempConversions = [NSMutableArray arrayWithCapacity:0];
        NSMutableArray *tempCategories = [NSMutableArray arrayWithCapacity:0];

        // Store conversions
        for(NSDictionary *dict in [dictionary valueForKey:@"Conversions"]) {
            [tempConversions addObject:[dict valueForKey:@"name"]];
            [tempCategories addObject:[dict valueForKey:@"conversions"]];
        }
        [dictionary release];

        self.conversions = tempConversions;
        self.categories = tempCategories;

        [self loadIntoPicker:0];
    }
...