Cách nhận giá trị đã chọn từ UIPickerView


76

Tôi biết rằng với UIDatePicker, bạn có thể sử dụng một số thứ như:

NSDate *myDate = picker.date;

Nhưng tôi đang sử dụng UIPickerView trong chế độ xem của mình. Tương tự, tôi có thể chọn giá trị như thế nào? Hay tôi phải thiết lập loại phương thức didSelectRow để thực hiện việc này?

Cập nhật: Mã này hoạt động cho bộ chọn có 1 thành phần:

NSInteger row;
NSString *weightSelected;

row = [repPicker selectedRowInComponent:0];
weightSelected = [pickerArray objectAtIndex:row];

Tôi đã làm mệt mã này cho bộ chọn của mình với 2 thành phần, nhưng nó đang đóng băng:

NSInteger row1, row2;
NSString *weightSelected1;
NSString *weightSelected2;

row1 = [repPicker selectedRowInComponent:0];
row2 = [repPicker selectedRowInComponent:1];
weightSelected1 = [pickerArray objectAtIndex:row1];
weightSelected2 = [pickerArray objectAtIndex:row2];
NSString *weightSelected = [NSString stringWithFormat:@"%@.%@", weightSelected1, weightSelected2];

Câu trả lời:


129

Bạn có thể lấy nó theo cách sau:

NSInteger row;
NSArray *repeatPickerData;
UIPickerView *repeatPickerView;

row = [repeatPickerView selectedRowInComponent:0];
self.strPrintRepeat = [repeatPickerData objectAtIndex:row];

2
strPrintRepeat không là gì ngoài một biến lưu trữ giá trị chuỗi của PickerView. Đó là: - NSString * strPrintRepeat.
SJS

Cảm ơn Jay, tôi đã làm việc với bộ chọn của tôi có một thành phần. Bạn có thể giúp sửa đổi nó mặc dù để làm việc với bộ chọn của tôi có 2 thành phần không? Tôi đã thêm mã chính xác mà tôi đang sử dụng cho 1 bộ chọn thành phần trong câu hỏi, cảm ơn.

4
Tôi không hiểu câu trả lời này ... chính xác thì repeatPickerData là gì? Làm thế nào mà nó được dân cư?
zakdances

@yourfriendzak repeatPickerData ở đây Tôi vừa khai báo điều đó nhưng nó sẽ không đến ở đây. nó sẽ xuất hiện trên phương thức viewDidLoad và nó chứa giá trị mà chúng ta sẽ hiển thị trong UIPickerView. Cảm ơn bạn đã đặt câu hỏi và nếu bạn vẫn còn nghi ngờ thì chúng tôi hoan nghênh bạn đặt câu hỏi.
SJS

Để làm rõ một chút, hãy nhìn nó theo cách này. NSLog (@ "% @", [self.arrayFields objectAtIndex: [self.queryPicker1 selectRowInComponent: 0]]); Trong đó arrayFields là mảng dữ liệu cho UIPickerView. Trong đó queryPicker1 là UIPickerView. Trong đó selectRowInComponent: 0 là cột đầu tiên (nếu bạn có 2 cột trong bộ chọn và muốn giá trị cho lần sử dụng thứ 2 là 1 thay vì 0) của UIPickerView.
sangony

34

Bạn có thể lấy văn bản của mục đã chọn trong bất kỳ phần nào của bộ chọn bằng cách sử dụng cùng một chức năng mà PickerView thực hiện, từ lớp ViewController tùy chỉnh của bạn:

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

sử dụng mục đã chọn

[myPickerView selectedRowInComponent:0]

vì vậy, để đặt văn bản của nhãn trong một ô tùy chỉnh bằng cách sử dụng giá trị hiện được chọn từ phần thứ 2 của myPickerView (có thể là một thuộc tính của bộ điều khiển chế độ xem của bạn)

[cell.label setText:[self pickerView:myPickerView titleForRow:[myPickerView selectedRowInComponent:1] forComponent:1]];

Chỉ cần thay đổi cả hai: 1s thành: 2s, v.v. cho mỗi phần


16
+1 - điều này tốt hơn đáng kể so với câu trả lời được chấp nhận (tào lao) hiện tại. Nó rõ ràng hơn, không sử dụng các biến lạ chưa được giới thiệu hoặc giải thích và không giả định (mà không nêu rõ) rằng UIPickerViewDelegateđang lấy tiêu đề hàng từ một mảng. Thành thật mà nói, đây phải là câu trả lời được chấp nhận.
Mark Amery

7

Đây là những gì tôi đã làm:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

    selectedEntry = [allEntries objectAtIndex:row];

}

Các selectedEntrylà một NSStringvà sẽ tổ chức các mục đang được chọn trong pickerview. Tôi chưa quen với mục tiêu C nhưng tôi nghĩ điều này dễ dàng hơn nhiều.


5

Bạn có thể truy cập hàng đã chọn cho một thành phần nhất định bằng phương pháp sau:

- (NSInteger)selectedRowInComponent:(NSInteger)component

Nếu không, triển khai chức năng ủy quyền là tùy chọn duy nhất khác.


Được rồi, tôi hiện có một dimissPickerphương thức được gọi khi nhấn nút gửi. Tôi muốn giá trị được chọn sau đó được lưu hoặc để cập nhật nút, v.v. khi phương thức dissmissPicker được gọi. Tôi có thể làm cái này như thế nào? Tôi có cần thêm selectedRowInCompnentphương thức không?

Đó có lẽ là cách tốt nhất để làm điều đó, vâng
drewag

Ok, hoàn hảo, bạn có thể giúp tôi thiết lập điều này? Tôi vừa thêm selectedRowInComponentphương thức nhưng chính xác thì tôi phải làm gì với nó. Nó phải trả về giá trị đã chọn. Tôi cũng có 2 thành phần trong clicker.

Bạn có thể thiết lập người ủy quyền để theo dõi giá trị đã chọn của bộ chọn. Mỗi khi người dùng thay đổi một thành phần, chức năng đó sẽ được gọi. Bạn có thể sử dụng hàng đã chọn để nhận được giá trị ra khỏi các mảng đang được sử dụng để điền vào nó, và sau đó tiết kiệm trạng thái đó trong các đại biểu để truy cập sau này khi bạn muốn lưu các giá trị vĩnh viễn
drewag

2

Bạn sẽ cần hỏi đại diện của người chọn, giống như cách ứng dụng của bạn làm. Đây là cách tôi làm điều đó từ bên trong UIPickerViewDelegate của mình:

func selectedRowValue(picker : UIPickerView, ic : Int) -> String {

    //Row Index
    let ir  = picker.selectedRow(inComponent: ic);

    //Value
    let val = self.pickerView(picker,
                              titleForRow:  ir,
                              forComponent: ic);
    return val!;
}

0

Bạn phải sử dụng didSelectRowphương thức ủy nhiệm, vì a UIPickerViewcó thể có một số thành phần tùy ý. Không có "objectValue" hay bất cứ thứ gì tương tự, vì điều đó hoàn toàn phụ thuộc vào bạn.


0

Lấy tiêu đề đã chọn của người chọn:

let component = 0
let row = picker.selectedRow(inComponent: component)
let title = picker.delegate?.pickerView?(picker, titleForRow: row, forComponent: component)

0
       NSInteger SelectedRow;
                   SelectedRow = [yourPickerView selectedRowInComponent:0];
                   selectedPickerString = [YourPickerArray objectAtIndex:SelectedRow];
                   self.YourTextField.text= selectedPickerString;

    // if  you want to move pickerview to selected row then 
 for (int i = 0; I<YourPickerArray.count; i++) {
  if ([[YourPickerArray objectAtIndex:i] isEqualToString:self.YourTextField.text]) { 
[yourPickerView selectRow:i inComponent:0 animated:NO];
 }
}

1
Khi có thể, hãy cố gắng cung cấp giải thích bổ sung thay vì chỉ mã. Những câu trả lời như vậy có xu hướng hữu ích hơn vì chúng giúp các thành viên của cộng đồng và đặc biệt là các nhà phát triển mới hiểu rõ hơn lý do của giải pháp và có thể giúp ngăn chặn nhu cầu giải quyết các câu hỏi tiếp theo.
Rajan

OK chắc chắn. Cảm ơn vì Mẹo
maan89

-2
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
   weightSelected = [pickerArray objectAtIndex:row];
}

-5

Đây là câu trả lời của tôi

- (IBAction)Result:(id)sender 
{
   self.statusLabel.text = DataSource[[pickerViewTool selectedRowInComponent:0]];

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.