简体   繁体   中英

UIStepper in iOS value in UILabel

Hi am using UIStepper in tableview cell. When UIStepper value changed i have to display the value in label in table view cell..Here is the code

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
       UILabel *lblQuantityValue = [[UILabel alloc] initWithFrame:CGRectMake(140, 410, 50, 30)];
       lblQuantityValue.text = @"1";
       lblQuantityValue.tag = indexPath.section;
       lblQuantityValue.backgroundColor = [UIColor clearColor];
       [[lblQuantityValue layer] setCornerRadius:5];
       [[lblQuantityValue layer] setMasksToBounds:YES];
       [[lblQuantityValue layer] setBorderWidth:1.0f];
       [[lblQuantityValue layer] setBorderColor:[[UIColor orangeColor]CGColor]];
       [cell addSubview:lblQuantityValue];

       UIStepper *stepper = [[UIStepper alloc] initWithFrame:CGRectMake(200, 410, 50, 30)];
       [stepper addTarget:self action:@selector(stepper_ValueChanged:) for   ControlEvents:UIControlEventValueChanged];
       stepper.tag = indexPath.row;
       stepper.minimumValue = 1;
       stepper.maximumValue = 10;
       [cell addSubview:stepper];
}

stepper_ValueChanged Method is as follows

-(void)stepper_ValueChanged:(UIStepper*)sender
{
 UILabel *lblQuantityValue = (UILabel*)[self.view viewWithTag:sender.tag];
 int value2 = [sender value];
 lblQuantityValue.text = [NSString stringWithFormat:@"%d", value2];
}

i am getting crash report as follows

-[UIView setText:]: unrecognized selector sent to instance 0x111e10640
2014-02-26 11:22:24.159 Hyderabad Bazar[2115:a0b] *** Terminating app due to uncaught     exception 'NSInvalidArgumentException', reason: '-[UIView setText:]: unrecognized selector sent to instance 0x111e10640'
*** First throw call stack:
(
0   CoreFoundation                      0x0000000101ce3795 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x00000001019bf991 objc_exception_throw + 43
2   CoreFoundation                      0x0000000101d74bad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3   CoreFoundation                      0x0000000101cd509d ___forwarding___ + 973
4   CoreFoundation                      0x0000000101cd4c48 _CF_forwarding_prep_0 + 120
5   Hyderabad Bazar                     0x00000001000202a6 -[CartViewController stepper_ValueChanged:] + 390
6   UIKit                               0x0000000100628a8a -[UIApplication sendAction:to:from:forEvent:] + 104
7   UIKit                               0x0000000100628a20 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 17
8   UIKit                               0x00000001006fc91c -[UIControl _sendActionsForEvents:withEvent:] + 203
9   UIKit                               0x0000000100a895d7 -[UIStepper _updateCount:] + 338
10  UIKit                               0x0000000100a89346 -[UIStepper endTrackingWithTouch:withEvent:] + 32
11  UIKit                               0x00000001006fbe52 -[UIControl touchesEnded:withEvent:] + 472
12  UIKit                               0x000000010092cc0d _UIGestureRecognizerUpdate + 5149
13  UIKit                               0x000000010065d2e5 -[UIWindow _sendGesturesForEvent:] + 928
14  UIKit                               0x000000010065dfa5 -[UIWindow sendEvent:] + 910
15  UIKit                               0x0000000100637962 -[UIApplication sendEvent:] + 211
16  UIKit                               0x000000010062579f _UIApplicationHandleEventQueue + 9549
17  CoreFoundation                      0x0000000101c72e61 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
18  CoreFoundation                      0x0000000101c72732 __CFRunLoopDoSources0 + 242
19  CoreFoundation                      0x0000000101c8e5bf __CFRunLoopRun + 767
20  CoreFoundation                      0x0000000101c8ded3 CFRunLoopRunSpecific + 467
21  GraphicsServices                    0x000000010408a3a4 GSEventRunModal + 161
22  UIKit                               0x0000000100627a63 UIApplicationMain + 1010
23  Hyderabad Bazar                     0x00000001000274e3 main + 115
24  libdyld.dylib                       0x00000001028067e1 start + 0

Please help me

Two different approaches that you may find more workable:

Subclass UITableViewCell, add in a UIStepper and UILabel as properties of the cell, and add the cell as a target for UISteppers valueChanged actions, updating the label when the value changes. Depending on how you're hoping to persist things, this could get wonky with dequeueing and prepareForReuse which brings us to the other idea...

OR

Create a proper class variable or property NSMutableArray that hold's the text for all the cells, regardless of if they are visible or not. The labels are always populated from this array, not directly from the stepper. You still use a Target/Action pair to have the cell respond to valueChanged events from the UIStepper, but you wire up the tableView as the cell's delegate, and use a protocol to make a call like this from the cell:

[self.tableViewDelegate newValue:value forCell:self];

Then have the tableView implement the protocol method like this:

- (void)newValue:(NSString*)value forCell:(CustomCellClassName*)cell
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    //now use the index path to set the "value" parameter at the right place in your class variable or property

    //Now that the data source is updated, refresh the table
    [self.tableView reloadData];
}

The code assigns indexPath.row as the stepper tag. In row 0 (zero) that tag is zero. viewWithTag: returns the first view in the receiver's view hierarchy with that tag including the receiver . The problem then is that

UILabel *lblQuantityValue = (UILabel*)[self.view viewWithTag:sender.tag];

...is returning self.view, whose tag is undoubtedly zero. The quick solution is to set the tags to row+1, and adjust the lookup accordingly.

Try this,

 -(void)stepper_ValueChanged:(UIStepper*)sender
 {
      int tag = sender.tag;
      int labelTagInCell = //tag of label in cell
      //assumes only 1 section
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:tag inSection:0];
      UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
      UILabel *lblQuantityValue = (UILabel*)[cell viewWithTag:labelTagInCell];
      int value2 = [sender value];
      lblQuantityValue.text = [NSString stringWithFormat:@"%d", value2];
 }

It will be better use a custom cell, ie: subclass of UITableViewCell and control value change of stepper from that class.

in CustomCell.h

 @property (strong, nonatomic) UILabel *lblQuantityValue;
 @property (strong, nonatomic) UIStepper *stepper;

in CustomCell.m

 - (void)awakeFromNib {
     [super awakeFromNib];
      self.lblQuantityValue = [[UILabel alloc] initWithFrame:CGRectMake(140, 410, 50, 30)];
      self.lblQuantityValue.text = @"1";
      self.lblQuantityValue.tag = indexPath.section;
      self.lblQuantityValue.backgroundColor = [UIColor clearColor];
      [[self.lblQuantityValue layer] setCornerRadius:5];
      [[self.lblQuantityValue layer] setMasksToBounds:YES];
      [[self.lblQuantityValue layer] setBorderWidth:1.0f];
      [[self.lblQuantityValue layer] setBorderColor:[[UIColor orangeColor]CGColor]];
      [self addSubview:lblQuantityValue];

      self.stepper = [[UIStepper alloc] initWithFrame:CGRectMake(200, 410, 50, 30)];
      [self.stepper addTarget:self action:@selector(stepper_ValueChanged:) for   ControlEvents:UIControlEventValueChanged];
      self.stepper.tag = indexPath.row;
      self.stepper.minimumValue = 1;
      self.stepper.maximumValue = 10;
      [self addSubview:stepper];
 }

 -(void)stepper_ValueChanged:(UIStepper*)sender
 {
      int value2 = [self.stepper value];
      self.lblQuantityValue.text = [NSString stringWithFormat:@"%d", value2];
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM