2010-05-25 11 views
13

में एकाधिक पंक्ति चयन मैं एक यूआईपीकर व्यू में एकाधिक पंक्तियों का चयन करना चाहता हूं, इसलिए मुझे एक टेबल में अपना डेटा दिखाने का विचार था और इस तालिका को पिकर के सबव्यूव के रूप में जोड़ने का विचार था। मैंने कोशिश की है लेकिन सफल नहीं हुआ।UIPickerView

कोई सुझाव यह कैसे करें?

उत्तर

12

आईफोन पर एकाधिक चयन के लिए "स्वीकृत" यूआई चेकमार्क के साथ एक UITableView का उपयोग करना है (यानी एकाधिक चयन के लिए UIPickerView का उपयोग न करें)।

हालांकि, यदि आपको जरूरी है, तो यहां एक खाली पिकर बनाकर और इसके शीर्ष पर एक टेबल दृश्य डालकर http://www.iphonedevsdk.com/forum/iphone-sdk-development/14634-uipickerview-multiple-selection.html नकली कैसे करें, इसके निर्देश हैं।

+0

थैंक्स डोस्ट, यह वास्तव में मेरी मदद करता है। मेरी समस्या हल हो गई है। आपका बहुत बहुत धन्यवाद। – Jack

+0

उस मामले में आपको यह जवाब स्वीकार करना चाहिए [टिक चिह्न पर क्लिक करें] (और शायद आपके कुछ अन्य प्रश्नों पर वापस जाएं और ऐसा ही करें!) – Andiih

7

लागू UIPickerView बहु-चयन-व्यवहार (मोबाइल सफारी में) की तरह pickerview के सामने अन्य दृश्यों को जोड़ने के बिना प्राप्त करने के लिए एक त्वरित हैक, किसी को भी रुचि है, तो: https://github.com/alexleutgoeb/ALPickerView

सुधार अत्यधिक सराहना कर रहे हैं!

14

आप UITableView के बिना यह कर सकते हैं, बस UITapGestureRecognizer का उपयोग कर :)

इसके अलावा अपने ज फ़ाइल में कहीं NSMutableArray *selectedItems जोड़ें।

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 
    UITableViewCell *cell = (UITableViewCell *)view; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 
     [cell setBackgroundColor:[UIColor clearColor]]; 
     [cell setBounds: CGRectMake(0, 0, cell.frame.size.width -20 , 44)]; 
     UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleSelection:)]; 
     singleTapGestureRecognizer.numberOfTapsRequired = 1; 
     [cell addGestureRecognizer:singleTapGestureRecognizer]; 
    } 

    if ([selectedItems indexOfObject:[NSNumber numberWithInt:row]] != NSNotFound) { 
     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } else { 
     [cell setAccessoryType:UITableViewCellAccessoryNone]; 
    } 
    cell.textLabel.text = [datasource objectAtIndex:row]; 
    cell.tag = row; 

    return cell; 
} 

- (void)toggleSelection:(UITapGestureRecognizer *)recognizer { 
    NSNumber *row = [NSNumber numberWithInt:recognizer.view.tag]; 
    NSUInteger index = [selectedItems indexOfObject:row]; 
    if (index != NSNotFound) { 
     [selectedItems removeObjectAtIndex:index]; 
     [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryNone]; 
    } else { 
     [selectedItems addObject:row]; 
     [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } 
} 
+0

इस उदाहरण में, आपने कभी पहचानकर्ता.view.tag सेट नहीं किया है। शायद इसे संशोधित करने की आवश्यकता है –

+0

आप सही हैं। यह अभी तय है। – suda

+2

मेरे पास तीन पिकर्स हैं और मुझे केवल एक पिकर के लिए इस तरह के एकाधिक चयन की आवश्यकता है .. मुझे अन्य पिकर्स के लिए क्या वापस जाना चाहिए? – Mano

1
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
     return true; 
} 

और आप इस विधि ओवरराइड करने के लिए की जरूरत है, अन्य किसी और ios9 फार्म, टैप जेस्चर recognization कार्य नहीं करेगा।

+0

कृपया अपने कोड उदाहरण से पहले कोड प्रारूप (4 रिक्त स्थान) का उपयोग करें, ताकि आप अपना कोड बना सकें उत्तर स्पष्ट –

2

निम्नलिखित कोड आईओएस 10 के लिए काम करता है। मुझे पुराने संस्करणों पर इसका परीक्षण करने का मौका नहीं मिला लेकिन मुझे लगता है कि इसे काम करना चाहिए। यह विचार @ सूडा के जैसा ही है लेकिन यह प्रत्येक पंक्ति में टैप पहचानकर्ता जोड़ने के बजाय सीधे एक पिकर व्यूअर को जोड़ता है, क्योंकि यह आईओएस 7 + पर काम नहीं करता है।

ब्रेवटी के लिए, मैंने UIPickerViewDataSource और UIPickerViewDelegate प्रोटोकॉल का पूर्ण कार्यान्वयन शामिल नहीं किया, केवल एकाधिक चयन को लागू करने के लिए प्रासंगिक भागों को शामिल किया गया।

// 1. Conform to UIGestureRecognizerDelegate protocol 
@interface MyViewController() <UIPickerViewDataSource, UIPickerViewDelegate, UIGestureRecognizerDelegate> 

@property (nonatomic, strong) NSMutableArray *selectedArray; // To store which rows are selected 
@property (nonatomic, strong) NSArray *dataArray;   // Picker data 
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView; 

@end 

@implementation MyViewController 

- (void)viewDidLoad 
{  
    [super viewDidLoad]; 

    self.selectedArray = [NSMutableArray array]; 
    self.dataArray = @[@"Option 1", @"Option 2", @"Option 3", @"Option 4"]; 

    // 2. Add tap recognizer to your picker view 
    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerTapped:)]; 
    tapRecognizer.delegate = self; 
    [self.pickerView addGestureRecognizer:tapRecognizer]; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return true; 
} 

- (void)pickerTapped:(UITapGestureRecognizer *)tapRecognizer 
{ 
    // 3. Find out wich row was tapped (idea based on https://stackoverflow.com/a/25719326) 
    if (tapRecognizer.state == UIGestureRecognizerStateEnded) { 
     CGFloat rowHeight = [self.pickerView rowSizeForComponent:0].height; 
     CGRect selectedRowFrame = CGRectInset(self.pickerView.bounds, 0.0, (CGRectGetHeight(self.pickerView.frame) - rowHeight)/2.0); 
     BOOL userTappedOnSelectedRow = (CGRectContainsPoint(selectedRowFrame, [tapRecognizer locationInView:self.pickerView])); 
     if (userTappedOnSelectedRow) { 
      NSInteger selectedRow = [self.pickerView selectedRowInComponent:0]; 
      NSUInteger index = [self.selectedArray indexOfObject:[NSNumber numberWithInteger:selectedRow]]; 

      if (index != NSNotFound) { 
       NSLog(@"Row %ld OFF", (long)selectedRow); 
       [self.selectedArray removeObjectAtIndex:index]; 
      } else { 
       NSLog(@"Row %ld ON", (long)selectedRow); 
       [self.selectedArray addObject:[NSNumber numberWithInteger:selectedRow]]; 
      } 
      // I don't know why calling reloadAllComponents sometimes scrolls to the first row 
      //[self.pickerView reloadAllComponents]; 
      // This workaround seems to work correctly: 
      self.pickerView.dataSource = self;    
      NSLog(@"Rows reloaded"); 
     } 
    } 
} 

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 
{  
    // 4. Customize your Picker row as needed. 
    // This is a very simple view just to make the point 

    UILabel *pickerLabel = (UILabel *)view; 

    if (pickerLabel == nil) { 
     pickerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 400, 32)]; 
    } 

    BOOL isSelected = [self.selectedArray indexOfObject:[NSNumber numberWithInteger:row]] != NSNotFound; 
    NSString *text = [self.dataArray objectAtIndex:row]; 
    text = [text stringByAppendingString:isSelected ? @"☒ " : @"☐ "]; 
    [pickerLabel setText:text]; 

    return pickerLabel; 
} 


// Do not forget to add the remaining methods to conform the UIPickerViewDataSource and UIPickerViewDelegate protocols! 

@end 
+0

ओएमजी! बहुत बहुत धन्यवाद @ पागलियन! आपने मेरा दिन बचा लिया! मुझे 5 घंटे के लिए reloadAllComponent को कॉल करते समय स्क्रॉल को अक्षम करने के तरीके के बारे में सोचा गया था! और आप मुझे कोड की केवल 1 पंक्ति के साथ बचाओ !!!!!! – KTang

संबंधित मुद्दे