Недвижимость меняется, но я не могу понять, кто это делает - PullRequest
0 голосов
/ 26 июля 2010

У меня есть UIViewController (называемый AdjustViewController), который представляет другой UIViewController (называемый SourcePickerViewController) с UIPickerView модально. Я генерирую экземпляры AdjustViewController, а они в свою очередь создают SourcePickerViewController. Я делаю NSDictionary и назначаю его и integer для AdjustViewController, и он в свою очередь устанавливает те же свойства в SourcePickerController. Таким образом, я могу повторно использовать контроллеры. NSDictionary настроен на UITableViewController, в котором есть все AdjustViewController s.

Проблема возникает, когда у некоторых сборщиков должен быть 1 компонент, а у некоторых - 2. Целое число, которое я передаю, называется numberOfComponents Когда я делаю сборщик с numberOfComponents = 1, он каким-то образом меняется на = 2, но я не вижу как. У меня есть NSLogs повсюду, и я вижу, как это происходит, как только вызывается метод делегата средства выбора numberOfComponentsInPickerView. Это 1 прямо перед и 2 сразу после.

Там явно больше кода, но я думаю, что у меня есть все важные части. Хотя, если бы это было правдой, возможно, я бы знал, где проблема!


Внутри MenuViewController.m

- (void)viewDidLoad {
    NSLog(@"ChemicalViewController launched");
    self.title = @"Adjust Chemicals";
    NSMutableArray *array = [[NSMutableArray alloc] init];

// Chlorine Controller
    AdjustViewController *chlorineAdjustViewController = [[AdjustViewController alloc] initWithNibName:@"AdjustViewController" bundle:nil];
    chlorineAdjustViewController.title = @"FC - Free Chlorine";
    chlorineAdjustViewController.numberOfComponents = 2;
    NSLog(@"Generating chlorine source dictionary");
    NSDictionary *chlorineSourceDictionary = [self generateChlorineDictionary];
    chlorineAdjustViewController.dictionaryOfSources = chlorineSourceDictionary;
    [chlorineSourceDictionary release];
    [array addObject:chlorineAdjustViewController];
    [chlorineAdjustViewController release];

// CYA Controller
    AdjustViewController *cyaAdjustViewController = [[AdjustViewController alloc] initWithNibName:@"AdjustViewController" bundle:nil];
    cyaAdjustViewController.title = @"CYA - Cyanuric Acid";
    cyaAdjustViewController.numberOfComponents = 1;
    NSLog(@"Generating cya source dictionary");
    NSDictionary *cyaSourceDictionary = [self generateCYADictionary];
    cyaAdjustViewController.dictionaryOfSources = cyaSourceDictionary;
    [cyaSourceDictionary release];
    [array addObject:cyaAdjustViewController];
    [cyaAdjustViewController release];

Внутри AdjustViewController.m

// Present the picker for chlorine selection
- (IBAction)getChemicalSource {
    SourcePickerViewController *sourcePickerViewController = [[SourcePickerViewController alloc] init];
    sourcePickerViewController.delegate = self;
    NSLog(@"getChemicalSource setting numberOfComponents %d", self.numberOfComponents);
    sourcePickerViewController.numberOfComponents = self.numberOfComponents;
    NSLog(@"getChemicalSource sending numberOfComponents %d", sourcePickerViewController.numberOfComponents);
    sourcePickerViewController.dictionaryOfSources = self.dictionaryOfSources;
    [self presentModalViewController:sourcePickerViewController animated:YES];
    [sourcePickerViewController release];
}

#pragma mark -
#pragma mark Picker View Delegate Methods

// Returns the values from the picker if a source was chosen
- (void)sourcePickerViewController:(SourcePickerViewController *)controller 
               didSelectSource:(NSString *)source 
              andConcentration:(NSString *)concentration 
                   andConstant:(float)constant 
                   andIsLiquid:(BOOL)isLiquid {


    sourceField.text = [[NSString alloc] initWithFormat:@"%@, %@", source, concentration];
    [self updateAdvice];
    NSLog(@"Returned source = %@, concentration = %@, sourceConstant = %1.7f, isLiquid = %d", source, concentration, constant, isLiquid);
    [self dismissModalViewControllerAnimated:YES];
}

// Returns from the picker without choosing a new source
- (void)sourcePickerViewController:(SourcePickerViewController *)controller 
               didSelectCancel:(BOOL)didCancel {
    [self updateAdvice];
    NSLog(@"Returned without selecting source");
    [self dismissModalViewControllerAnimated:YES];
}

Внутри SourceViewController.m

- (void)viewDidLoad {
    NSLog(@"SourcePickerViewController launched");
    NSLog(@"viewDidLoad");
    NSLog(@"Received numberOfComponents %d", self.numberOfComponents);
    self.chemicalSources = dictionaryOfSources;
    NSArray *components = [self.chemicalSources allKeys];
    NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
    self.sources = sorted; // This array has the chemical sources

    if (self.numberOfComponents = 2) {
        NSString *selectedSource = [self.sources objectAtIndex:0];
        NSArray *chemArray = [self.chemicalSources objectForKey:selectedSource];
        NSMutableArray *concentrationArray = [[NSMutableArray alloc] init];
        int num = [chemArray count];
        for (int i=0; i<num; i++) {
            [concentrationArray addObject:[[chemArray objectAtIndex:i] chemConcentration]];
        }
        self.concentrations = concentrationArray;
    }
    [super viewDidLoad];
}

    #pragma mark -
    #pragma mark Picker Data Source Methods

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    NSLog(@"numberOfComponentsInPickerView, self.numberOfComponents = %d", self.numberOfComponents);
    return self.numberOfComponents;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    NSLog(@"numberOfRowsInComponent, self.numberOfComponents = %d", self.numberOfComponents);
    if (component == kSourceComponent)
        return [self.sources count];
    return [self.concentrations count];
}

#pragma mark Picker Delegate Methods

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (component == kSourceComponent)
        return [self.sources objectAtIndex:row];
    return [self.concentrations objectAtIndex:row];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSLog(@"didSelectRow, self.numberOfComponents = %d", self.numberOfComponents);
    if (numberOfComponents = 2) {
        if (component == kSourceComponent) {
            NSString *selectedSource = [self.sources objectAtIndex:row];
            NSArray *chemArray = [self.chemicalSources objectForKey:selectedSource];
            NSMutableArray *concentrationArray = [[NSMutableArray alloc] init];
            int num = [chemArray count];
            for (int i=0; i<num; i++) {
                [concentrationArray addObject:[[chemArray objectAtIndex:i] chemConcentration]];
            }
    self.concentrations = concentrationArray;
    [picker selectRow:0 inComponent:kConcentrationComponent animated:YES];
    [picker reloadComponent:kConcentrationComponent];
    }
}
}

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    if (component == kConcentrationComponent)
        return 90;
    return 205;
}

1 Ответ

1 голос
/ 26 июля 2010

Я не просмотрел весь ваш код;Вместо этого я бы рекомендовал записывать свойства для numberOfComponents вместо @ synthesize'ing их.Просто избавьтесь от своего @synthesize и наберите:

 - (int)numberOfComponents {
   return m_numberOfComponents;
}

и

 - (void)setNumberOfComponents(int aNumberOfComponents) {
   m_numberOfComponents = aNumberOfComponents;
}

Затем установите точку останова в функции setNumberOfComponents, и вы сможете видеть ее каждый разпозвонил, чтобы вы могли видеть, что происходит.Надеюсь, это поможет!

...