2012-03-30 46 views
5

Tôi đang sử dụng UITableview tĩnh, được thiết lập trong bảng phân cảnh. Đối với một số ô (Style = Right detail) tôi đặt detailTextlabel.text trong viewWillAppear như sau:detailTextLabel không hiển thị ban đầu

self.recentProductsCell.detailTextLabel.text = description; 

Đối với ô này nhãn không xuất hiện. Nếu tôi NSLog văn bản nó cho thấy là OK. Tôi đã kiểm tra rằng detailTextLabel không bị ẩn. Tôi không thay đổi bất kỳ thuộc tính nào khác trong bảng phân cảnh. Ô có phụ kiện chi tiếtViết rõ ràng, nhưng đặt nó vào cái gì đó khác không có tác dụng.

Sau đó, điều lạ: Nếu tôi chạy và detailTextlabel không hiển thị, tôi chọn hàng bằng cách chạm vào nó và di chuyển ngón tay của tôi. Từ đó detailTextLabel hiển thị! Ngay cả khi ẩn và chỉnh sửa lại chế độ xem, nhãn vẫn hiển thị. Đặt lại và thiết lập nó trong mã tuy nhiên, làm cho nhãn biến mất một lần nữa.

Tôi có thể làm điều gì sai, hoặc đây có phải là lỗi không?

Đã chỉnh sửa: Đã đăng ký cả 5.0 và 5.1, cùng một hành vi. Tôi đã tìm thấy giải pháp thay thế xấu bằng cách chọn và bỏ chọn hàng này trong mã trong chế độ xemWillAppear. Vì vậy, tôi đã thêm:

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:3 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone]; 
[self.tableView deselectRowAtIndexPath: [NSIndexPath indexPathForRow:3 inSection:0] animated:NO]; 

Nó hoạt động, nhưng tôi có thể thấy hàng đang được chọn và bỏ chọn. Vì vậy, tôi cũng đã thay đổi selectionStyle, nhưng bây giờ hàng này nhấp nháy khi xem được hiển thị.

Nhận xét bổ sung: Trong cùng một chế độ xemLàm mới, tôi đặt chi tiếtLabel của các ô tĩnh khác và chúng hiển thị tốt.

+0

Bạn có thể vui lòng đăng mã có liên quan (nếu có) để tạo và tái sử dụng ô? Tôi vẫn còn có một vài lý thuyết về lý do tại sao hành vi này xảy ra nhưng tôi cần phải xem thêm mã để làm móng nó xuống. – Sam

+0

Xin lỗi cho bây giờ. Có lẽ sau những ngày lễ Phục sinh, kỳ nghỉ nhỏ sắp tới. Tôi nghĩ nó lạ đến nỗi tôi muốn cố gắng tái tạo trong một dự án xây dựng từ đầu và gửi một báo cáo lỗi cho Apple. Chỉ dành cho trải nghiệm. Nhưng nó sẽ mất một thời gian. Có lẽ thứ ba. Cảm ơn bạn đã quan tâm. – Bjinse

Trả lời

8

Tôi đã tìm thấy khi detailLabel không hiển thị, không phải lý do, IMHO là lỗi.

Nếu giá trị trước đó cho chi tiếtLabel.Tiếp theo là 0 hoặc chuỗi rỗng, chi tiếtLabel không hiển thị sau khi đặt giá trị mới. Nếu tôi đặt detailLabel thành bất kỳ thứ gì khác hơn nil/empty (ban đầu), và sau đó đặt nó thành cái gì khác, giá trị mới sẽ hiển thị chính xác.

Lý do không hiển thị có lẽ phức tạp hơn sau đó chỉ bị trống trước, nhưng trong trường hợp của tôi, điều này giải quyết được vấn đề của tôi. Tôi có thể hiển thị detailLabel ở màu nền nếu tôi muốn nó "trống".

+0

cảm ơn, nó đã hoạt động. xin vui lòng báo cáo cho táo. – santhu

+0

Cảm ơn, một lỗi lạ khác của quả táo. –

+0

2015, vẫn là lỗi. –

0

Cố gắng đặt ô Style = subtitle

+0

UITableViewCellStyleSubTitle – Injectios

+0

Vẫn còn vấn đề tương tự. Không có phụ đề nào được hiển thị ban đầu, nhưng được hiển thị sau khi chọn hàng. Tiêu đề chính được hiển thị ở giữa ban đầu và bật lên trên cùng để nhường chỗ cho detailLabel. – Bjinse

0

Bạn đang đặt nhãn ở vị trí không chính xác.

Đăng mã UITableViewDelegate/DataSource của bạn. Bạn cần đặt giá trị này ở một trong hai hoặc là cellForRowAtIndexPath: hoặc willDisplayCellAtIndexPath:

+0

Không, vì tôi đang sử dụng các ô STATIC, được tạo trong bảng phân cảnh bằng cách đặt Nội dung trong thanh tra Thuộc tính cho UITableView thành: Các ô tĩnh. Xem thêm câu trả lời cho câu hỏi trong: [link] (http://stackoverflow.com/questions/7863775/creating-custom-uitableviewcells-within-a-storyboard) – Bjinse

+0

Bạn vẫn có thể sử dụng 'willDisplayCellAtIndexPath'. Điều này sẽ cho phép bạn thực hiện các thay đổi cuối cùng ngay lập tức trước khi ô được vẽ trên màn hình. – Sam

+0

Alas, willDisplayCellAtIndexPath chỉ được kích hoạt khi tableview được xây dựng lần đầu tiên cho các ô tĩnh, từ: - [UITableView (UITableViewInternal) _createPreparedCellForGlobalRow: withIndexPath:]. Sau đó phương thức này không được kích hoạt khi ô được hiển thị. (Và có, đại biểu được đặt thành bộ điều khiển ..). – Bjinse

0

Bạn có thêm tất cả các điều khiển vào số contentView của UITableViewCell không? Nếu bạn chỉ cần thêm nó vào ô này đôi khi có thể dẫn đến hành vi chiến thắng.

+0

Tôi đang sử dụng kiểu UITableViewCellStyleValue2 được xác định trước (bằng cách chọn Style = Right Detail in IB). Vì vậy, tôi không làm điều khiển tùy chỉnh. – Bjinse

5

Tôi đã có một bản sao của vấn đề này. Cùng cấu hình - các ô tĩnh trong bảng phân cảnh, nhưng với các ô chi tiết bên trái. Tôi cũng thấy vấn đề khi chạm vào ô sẽ làm cho nó hiển thị.

Tôi đã giải quyết vấn đề này bằng cách đặt nội dung nhãn chi tiết ban đầu trong bảng phân cảnh thành một không gian duy nhất. Sau khi thiết lập nội dung nhãn chi tiết thực tế trong mã, tôi gửi một thông báo sizeToFit tới nhãn chi tiết.

+0

Tôi đã gặp lại lỗi này và giờ đây tôi đã có nhiều kinh nghiệm hơn. Câu trả lời của bạn là chính xác trong thiết lập đó một giá trị ban đầu trong storyBoard giúp. Tôi không cần phải gửi sizeToFit đến nhãn chi tiết. Khi kiểm tra trong trình gỡ lỗi, tôi thấy rằng nhãn detaillabel không có kích thước và nguồn gốc chính xác nếu không có mặc định được chỉ định trong bảng phân cảnh. Chỉ việc gửi sizeToFit mới thay đổi kích thước của khung chứ không phải gốc. Vấn đề của tôi được giải quyết. – Bjinse

+0

Kích thước để phù hợp với công việc như một giải pháp tốt cho tôi. Có ai báo cáo điều này với Apple không? – raeldor

0

Tôi gặp vấn đề tương tự và tôi nghĩ đó là lỗi. Nếu tôi giữ vòi nước của tôi trên dòng, tôi thấy detailTextLabel.

Như Bjinse đã nói, thường xảy ra nếu bạn đặt chi tiếtTextLabel trước đó thành không hoặc "" (không có dấu cách = chuỗi rỗng).

Vì vậy, tôi đã kết thúc đặt chi tiếtTextLabel mà tôi muốn trống thành "" (có khoảng trắng). Điều đó làm việc cho tôi.

0

Tôi thấy nó chỉ xảy ra trên iPhone 6plus (8.4) trong trường hợp của tôi.

Giải pháp 1 (Đề xuất):

Sau khi không sử dụng lại ô, giải quyết được sự cố.

//var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) 
//if cell == nil { 
// cell = UITableViewCell(style: .Value1, reuseIdentifier: cellIdentifier) 
//} 

var cell = UITableViewCell(style: .Value1, reuseIdentifier: cellIdentifier) 

Giải pháp 2:

Bởi vì văn bản cho thấy sau khi chúng tôi di chuyển hoặc cảm ứng, vì vậy tôi quyết định để tải lại dữ liệu. Điều này cũng làm việc, nhưng có một sự chậm trễ giữa các hiển thị xem và văn bản detailText hiển thị.

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    tableView.reloadData() 
} 
Các vấn đề liên quan