ios - Not able to reload second compoenent based on value in first component in UIPickerview -


i working uipickerview , trying implement functionality of loading second component data mapped value selected in first component. but, second component shows values mapped second row of first component.

with breakpoints noticed values correctly passed on - (uiview *)pickerview:(uipickerview *)ipickerview viewforrow:(nsinteger)irow forcomponent:(nsinteger)icomponent reusingview:(uiview *)iview method.

please see have done far. missing something?

#import "viewcontroller.h" #import "zxingobjc.h"  @interface viewcontroller ()  @property (nonatomic, assign) iboutlet uitextfield *barcodetextfield; @property (nonatomic, assign) iboutlet uiimageview *barcodeimageview; @property (weak, nonatomic) iboutlet uiscrollview *scrollview; @property (nonatomic, strong) nsarray *barcodetypes; @property (nonatomic, strong) nsdictionary *barcodes; @property (nonatomic, assign) nsinteger selectedbarcodetype;  @end   typedef enum {     onedbarcode = 0,     twodbarcode } barcodetypes;   @implementation viewcontroller  - (void)loadview {     [super loadview];      uitapgesturerecognizer *atapinsidetableview = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(handletap:)];     [atapinsidetableview setcancelstouchesinview:no];     [self.view addgesturerecognizer:atapinsidetableview]; }   - (void)viewdidload {     [super viewdidload];      nsarray *twodbarcodes = @[@"aztec", @"datamatrix", @"maxicode", @"pdf417", @"qrcode", @"rss14", @"rssexpanded"];     nsarray *onedbarcodes = @[@"codabar", @"code39", @"code93", @"code128", @"ean8", @"ean13", @"itf", @"upca", @"upce", @"upceanextension"];     self.barcodes = @{@"1d barcodes": onedbarcodes, @"2d barcodes": twodbarcodes};      self.barcodetypes = @[@"aztec", @"codabar", @"code39", @"code93", @"code128", @"datamatrix", @"ean8", @"ean13", @"itf", @"maxicode", @"pdf417", @"qrcode", @"rss14", @"rssexpanded", @"upca", @"upce", @"upce"];      self.selectedbarcodetype = onedbarcode;      [self.scrollview setscrollenabled:yes];     [self.scrollview setcontentsize:cgsizemake(320.0, 750.0)]; }   - (void)didreceivememorywarning {     [super didreceivememorywarning];     // dispose of resources can recreated. }   - (ibaction)generatebarcode:(id)sender {     uiimage *barcodeimage = [self barcodeimagefortext:self.barcodetextfield.text];     if (barcodeimage) {         self.barcodeimageview.image = barcodeimage;     } }   - (ibaction)dismissview:(id)isender {     [self.navigationcontroller dismissviewcontrolleranimated:yes completion:nil]; }   - (uiimage *)barcodeimagefortext:(nsstring *)ibarcode {     nserror* error = nil;     zxmultiformatwriter* writer = [zxmultiformatwriter writer];     zxbitmatrix* result = [writer encode:ibarcode                                   format:kbarcodeformatqrcode                                    width:500                                   height:500                                    error:&error];     if (result) {         cgimageref image = [[zximage imagewithmatrix:result] cgimage];          // cgimageref image can placed in uiimage, nsimage, or written file.          return [uiimage imagewithcgimage:image];     } else {         nsstring* errormessage = [error localizeddescription];         nslog(@"error: %@", errormessage);         return nil;     } }   - (void)handletap:(uitapgesturerecognizer *)irecognizer {     if (self.barcodetextfield) {         [self.barcodetextfield resignfirstresponder];     } }   #pragma mark - uipickerviewdatasource methods  - (nsinteger)numberofcomponentsinpickerview:(uipickerview *)ipickerview {     return self.barcodes.allkeys.count; }   - (nsinteger)pickerview:(uipickerview *)ipickerview numberofrowsincomponent:(nsinteger)icomponent {     nsarray *barcodekeys = self.barcodes.allkeys;     nsarray *barcodevalues = self.barcodes[barcodekeys[icomponent]];      if (icomponent == onedbarcode) {         return barcodekeys.count;     }      return barcodevalues.count; }   #pragma mark - uipickerviewdelegate methods  - (uiview *)pickerview:(uipickerview *)ipickerview viewforrow:(nsinteger)irow forcomponent:(nsinteger)icomponent reusingview:(uiview *)iview {     uilabel *label = (uilabel *)iview;      if (!label) {         label = [[uilabel alloc] initwithframe:cgrectmake(0.0f, 0.0f, self.view.frame.size.width, 60.0f)];         label.backgroundcolor = [uicolor clearcolor];         label.textalignment = nstextalignmentcenter;         label.adjustsfontsizetofitwidth = yes;     }      nsarray *barcodekeys = self.barcodes.allkeys;     nsarray *barcodevalues = self.barcodes[barcodekeys[icomponent]];      nsstring *labeltext;      if (icomponent == onedbarcode) {         labeltext = barcodekeys[irow];     } else if (icomponent == twodbarcode) {         labeltext = barcodevalues[irow];     }      label.text = labeltext;      return label; }   - (void)pickerview:(uipickerview *)ipickerview didselectrow:(nsinteger)irow incomponent:(nsinteger)icomponent {     [ipickerview reloadcomponent:icomponent];      if (icomponent == onedbarcode) {         self.selectedbarcodetype = onedbarcode;     } else {         self.selectedbarcodetype = twodbarcode;     }      [ipickerview reloadallcomponents]; }  @end 

there many thins wrong code. when user picks row in picker, load 2nd component if user chose value in 1st. don't reload under case.

in viewforrow method, have 2 problems:

  1. dictionaries not ordered , keys has no order. values 1st component in array can access them index.
  2. your attempt access barcodevalues based on component. should based on selected index of 1st component.

Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -