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:
- dictionaries not ordered , keys has no order. values 1st component in array can access them index.
- your attempt access
barcodevalues
based on component. should based on selected index of 1st component.
Comments
Post a Comment