2012-11-28 24 views
6

Chỉ cần làm rõ, tôi không hỏi làm thế nào để thiết lập chiều cao hàng một lần trong đầu khi UIpickerview đang được thiết lập. Tôi biết bạn sử dụng pickerView: rowHeightForComponent cho mục đích đó. Tuy nhiên, những gì tôi yêu cầu là nếu tôi muốn pickerView: rowHeightForComponent để trả về một giá trị biến, trong đó giá trị có thể thay đổi trong suốt thời gian tồn tại của UIpickerview, ví dụ, để đáp ứng với một nút bấm hoặc thay đổi mặc định cài đặt.Làm cách nào để tự động thay đổi chiều cao hàng của giao diện người dùng trong suốt cuộc đời?

Tôi thấy rằng, thật không may, bộ chọnXem: rowHeightForComponent chỉ được gọi một lần, khi bắt đầu, khi iOS đang thiết lập UIpickerview. Sau đó, nó không bao giờ gọi hàm pickerView: rowHeightForComponent một lần nữa, vì vậy không thể chọn thay đổi trong giá trị mà pickerView: rowHeightForComponent sẽ trả về nếu chỉ nó được gọi lại.

Tôi cho rằng tôi chỉ có thể phát hành UIpickerview và thiết lập một giao diện người dùng khác, buộc iOS gọi bộ chọnView: rowHeightForComponent một lần nữa, nhưng điều này có thể bất tiện và có thể cần lưu thông tin trạng thái. Có cách nào khác, dễ dàng hơn, để tự động thay đổi chiều cao hàng không? Cảm ơn!

Tìm kiếm xung quanh, tôi tìm thấy Changing UIPickerView row height (chỉ dành cho lần thiết lập lần đầu tiên của chiều cao hàng) và How to change the size of row in UIPickerView by button click?, nói về phương thức rowSizeForComponent, dường như chỉ sử dụng giá trị được lưu trong bộ nhớ cho chiều cao hàng.

Dưới đây là phần mã mà cố gắng để thay đổi chiều cao hàng, cùng với reloadAllComponents kiểm tra: theo đề nghị của @RileyE

NSLog(@"before, scrollviewSpacing is %d", self.mainViewController.IACscrollviewSpacing); 
if (0.0 != fromDefaultsScrollviewSpacing) { 
    self.mainViewController.IACscrollviewSpacing = (UInt8) round (60.0 - fromDefaultsScrollviewSpacing); 
} 
NSLog(@"now scrollviewSpacing is %d", self.mainViewController.IACscrollviewSpacing); 
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height); 
[self.mainViewController.PickIPAddress reloadAllComponents]; 
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height); 
[self.mainViewController.PickIPAddress reloadComponent:1]; 
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height); 

mang đến cho đầu ra sau trên console:

2012 -11-29 02: 32: 14.681 Máy tính địa chỉ IP [6404: c07] trước đây, scrollviewSpacing là 39
2012-11-29 02: 32: 18.913 Máy tính địa chỉ IP [6404: c07] now scrollviewSpacing is 22
2012- 11- 29 02: 32: 20.196 Máy tính địa chỉ IP [6404: c07] rowsizeforcomponent height is 39.000000 2012-11-29 02: 32: 28.865 Máy tính địa chỉ IP [6404: c07] rowsizeforcomponent height is 39.000000 2012-11-29 02:32 : 30,903 IP Address Calculator [6404: C07] rowsizeforcomponent chiều cao là 39,000000

và trong MainViewController (đó là UIpickerviewdelegate), tôi có

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component { 
return self.IACscrollviewSpacing; } 

Bên cạnh đó, tôi đặt một breakpoint ở đây, và tôi thấy nó chỉ được gọi khi UIPickerview ban đầu được thiết lập và không bao giờ nữa.

+0

Bạn đang nói rằng 'rowHeightForComponent:' được gọi lại nếu bạn gọi 'reloadComponent:' trên giao diện bộ chọn? – rmaddy

+0

Tôi nói rằng reloadAllComponents: không gọi rowHeightForComponent: một lần nữa, đó là một vấn đề đối với tôi. Nếu có, thì nó sẽ nhận giá trị mới mà tôi muốn sử dụng cho chiều cao hàng. – auspicious99

+0

Xin lỗi, tôi có lỗi đánh máy. Tôi có nghĩa là "không được gọi là", không "được gọi là". Bạn đã xác nhận rằng bây giờ. Điều này là bất ngờ. – rmaddy

Trả lời

0

Tất cả các phương pháp đại biểu được mời gọi một lần nữa và được cập nhật khi bạn gọi [yourPicker reloadAllComponents];

Kiểm tra các UIPickerViewUIPickerViewDelegate tài liệu. Hãy xem phần "Tải lại bộ chọn chế độ xem", đặc biệt là.

+0

Đọc lại câu hỏi. Nó không phải về quan điểm bảng. – rmaddy

+0

Cảm ơn, nhưng nó là một UIpickerview, không phải là một UItableview. Không có phương thức reloadData. Có reloadAllComponents hoặc reloadComponent: nhưng chỉ đọc lại dữ liệu (phương thức giao thức UIpickerviewdatasource) và không gọi phương thức giao thức UIpickerviewDelegate (ít nhất, không phải là pickerView: rowHeightForComponent). – auspicious99

+0

@ auspicious99 OK. Vâng, tôi đã cập nhật câu hỏi của mình. – RileyE

0

Tôi không chắc chắn nếu UIPickerView có thể tự động thay đổi chiều cao hàng.

Nhưng tôi đã triển khai tên chế độ xem bộ chọn DLPickerView. Bạn có thể trả về độ cao khác nhau cho hàng khác nhau.Về mặt lý thuyết, nó cũng có thể thay đổi chiều cao hàng trong suốt vòng đời của nó

Các vấn đề liên quan