Chọn hàng Sau khi UIPickerView được tải


77

Tôi có một ứng dụng cơ sở dữ liệu iPhone tải một UIPickerViewvới dữ liệu từ một bảng. Tôi muốn đặt hàng đã chọn thành một hàng cụ thể từ dữ liệu trong bảng khác.

Ví dụ: Giả sử tôi có một UIPickerViewchứa X số tên bạn bè của người dùng iPhone (số lượng tên có thể thay đổi; có thể là 1 hoặc 1000 và tất cả đều được người dùng nhập vào cơ sở dữ liệu). Người dùng iPhone có một bộ tùy chọn mà người bạn thân nhất hiện tại của họ là TED . Tôi muốn UIPickerViewvị trí của TED khi được hiển thị.

Tôi gọi ở selectRowđâu?

Tôi đã thử vào viewDidAppear, nhưng nó không bao giờ được gọi, trong titleForRowđó gây ra tất cả các loại hành vi kỳ lạ. viewDidLoadviewWillAppearnằm ngoài câu hỏi, vì tôi chưa biết có gì trong nguồn dữ liệu cho bộ chọn.


Chỉ cần đặt mã @jab vào câu trả lời của anh ấy sau khi tải dữ liệu và đưa ra ủy quyền. Đó là những gì đã làm việc cho tôi!
Anurag Sharma

Câu trả lời:


140

Gọi nó sau khi bạn lấy dữ liệu. Tôi không biết bạn tải dữ liệu ở đâu nên đây chỉ là bản mô phỏng của những gì sẽ hoạt động. Nếu điều này không hợp lý, hãy cho tôi biết bạn đang tải dữ liệu ở đâu để tôi có thể ghép nó lại với nhau trong đầu :)

-(void)viewDidLoad
{
    // load data from sql
    // self.someDataArray = DATAFROMSQL
    [picker reloadAllComponents];
    [picker selectRow:0 inComponent:0 animated:YES];
}

Cảm ơn, tôi đang truy xuất dữ liệu trong viewDidLoad giống như mô hình của bạn. Tôi đã phải tạo một phương pháp để liệt kê qua danh sách để tìm chỉ mục phù hợp sau đó đặt bộ chọn. Tôi nghĩ có lẽ tôi đã thiếu một lệnh gọi lại có thể được sử dụng sau khi bộ chọn được tải và trước khi quay lại vòng lặp sự kiện.
Steve Gibson

nó hoạt động, nhưng tại sao nó gây ra rất nhiều độ trễ khi tải chế độ xem? (trong một tình huống thanh tab)
CularBytes

@Jab câu trả lời của bạn là đúng trước khi gọi selectRowđừng quên cuộc gọi reloadAllComponents!!!!
Hattori Hanzō

44

Có một vấn đề phổ biến khi một mục UIPickerView (mặc định) cần được chọn khi UIPickerView được hiển thị ban đầu. Vấn đề có liên quan đến chuỗi sự kiện. Từ việc đọc các bài viết trước, có vẻ như [pickerView selectRow: n] thường được gọi trong sự kiện ViewDidLoad của bộ điều khiển chế độ xem. Tuy nhiên, dữ liệu UiPickerView chỉ được tải sau sự kiện ViewDidLoad, có nghĩa là mọi mã lựa chọn trong ViewDidLoad sẽ không có hiệu lực. Để khắc phục, hãy đặt mã lựa chọn trong ViewDidAppear;

- (void) viewDidAppear:(BOOL)animated {
[m_pickerView selectRow:nSelectedItem inComponent:0 animated:YES]; }

7

Đặt cái này ở bất cứ đâu bạn khởi tạo UIViewcái chứa của bạn UIPickerViewdưới dạng một chế độ xem phụ:

[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO];

4

Tôi vừa thấy rằng trên SDK 4.3, các hành vi tải thành phần khác nhau giữa iPhone và iPad. Trên iPhone, tôi sắp gọi selectRow: ngay sau khi khởi tạo chế độ xem trước hoặc sau khi thêm vào hệ thống phân cấp chế độ xem phụ. Tuy nhiên, trên iPad, cuộc gọi selectRow không mang lại kết quả. Tôi kết thúc bằng cách sử dụng performanceSelector: withObject: afterDelay: cuộc gọi đợi 0,1 giây trước khi kích hoạt selectRow: inComponent: animation :. Điều này đã có kết quả có thể đoán trước được trên iPhone và iPad.


3

Đối với Swift, nó chỉ đơn giản là:

self.picker?.selectRow(0, inComponent: 0, animated: true)

0

Nếu bạn muốn hàng đã chọn được đánh dấu vĩnh viễn, hãy sử dụng

myPickerView.subviews[0].subviews[0].subviews[2].backgroundColor = myPickerView.tintColor;
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.