2010-12-31 34 views
15

Tôi có một UITableViewController. Tôi tạo ra một headerView tùy chỉnh cho nó tableView trong phương pháp loadView như vậy:Tiêu đề tùy chỉnh UITableView biến mất sau khi cảnh báo bộ nhớ

(void)loadView { 
    [super loadView]; 

    UIView* containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height * 2)]; 
    containerView.tag = 'cont'; 
    containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; 

    UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.frame = CGRectMake(padding, height, width, height); 
    ... //configure UIButton and events 

    UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"] highlightedImage:[UIImage imageNamed:@"highlight.png"]];  
    imageView.frame = CGRectMake(0, 0, width, height); 
    ... //configure UIImageView 

    [containerView addSubview:button]; 
    [containerView addSubview:imageView]; 
    self.tableView.tableHeaderView = containerView; 

    [imageView release]; 
    [containerView release]; 
} 

Không ai trong số các phương pháp khác (viewDidLoad/Unload, vv) đều quá tải.

Bộ điều khiển này được lưu trữ trong tab. Khi tôi chuyển sang tab khác và mô phỏng cảnh báo bộ nhớ, sau đó quay lại tab này, số UITableView của tôi thiếu tiêu đề custon. Tất cả các hàng/phần được hiển thị như tôi mong đợi. Đặt một BP trong mã loadView ở trên, tôi thấy nó được gọi khi tôi chuyển trở lại tab sau khi cảnh báo bộ nhớ, nhưng tôi thực sự không thể thấy tiêu đề.

Bất kỳ ý tưởng nào về những gì tôi thiếu ở đây?

CHỈNH SỬA: Điều này xảy ra trên thiết bị và trình mô phỏng. Trên thiết bị, tôi chỉ để cho một cảnh báo bộ nhớ xảy ra bằng cách mở một loạt các ứng dụng khác nhau trong khi tôi đang ở chế độ nền.

+0

Tôi đoán bạn có mã trong chế độ xem của bạnDidUnload() như sau: self.tableView.tableHeaderView = nil; ? –

+0

No. "Không có phương pháp nào khác (viewDidLoad/Unload, vv) bị quá tải". Tôi có cần nó không? Tại sao? – psychotik

+0

Bối rối. Hy vọng người khác có thể giúp đỡ. –

Trả lời

2

Lưu giữView thay vì phát hành nó. Và trả về nó trong tableView: viewForHeaderInSection: (phương thức UITableViewDelegate).

+0

Có vấn đề gì với việc phát hành nó? 'tableHeaderView' vẫn giữ lại nó. Bất kể, 'loadView' đang được gọi khi tôi chuyển trở lại tab này vì vậy tôi không hiểu tại sao nó hoạt động ban đầu nhưng không phải sau một cảnh báo mem. – psychotik

-2

Vấn đề duy nhất mà tôi có thể thấy bằng cách chỉ xem loadView của bạn là bạn đang cố gắn thẻ containerView bằng một chuỗi. Đó phải là NSInteger theo như tôi biết.

+0

Đó không phải là một chuỗi. Lưu ý các dấu nháy đơn. – psychotik

+0

Nó không phải là một 'NSString' nhưng nó là một char *, không? Thuộc tính thẻ mong đợi một 'NSInteger'. – Bringo

+0

Số char * vẫn được khai báo với dấu ngoặc kép. Đó là giá trị int 32 bit, được định nghĩa là ký tự tuần tự. Tôi đảm bảo với bạn rằng nó hợp lệ và không liên quan đến vấn đề này. – psychotik

-1

Sự cố này đã được biết. Ví dụ, nếu bạn sử dụng TableViewDelegate tableView:viewForHeaderInSection: nó cũng sẽ không hoạt động.

Sự cố là iOS chứ không phải bạn. Không có nhiều câu hỏi về tableHeaderView vì không ai sử dụng nó và do đó Apple không nhận được bất kỳ mục nhập nào của BugTracker ...

Hãy xem câu hỏi cũ hơn: here. Và here là các vấn đề khác.

Vì vậy, tôi nghĩ rằng đó thực sự là lỗi SDK ...

+0

Điều gì^đã nói.Lưu ý rằng điều này làm việc như mong đợi cho đến khi một cảnh báo bộ nhớ, vì vậy tôi không nghĩ rằng có bất cứ điều gì về cơ bản sai với cách tôi xây dựng/gán công cụ cho View. – psychotik

6

phương thức loadView không được gọi là siêu. Thử xóa [super loadView]; và điều đó cũng có thể giải quyết vấn đề của bạn. Các phương thức xem được ghi đè khác (viewDidLoad, viewWillAppear, v.v.) có thể gọi siêu tốt. Xem tài liệu tại:

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

để xác nhận.

+0

Nó nêu rõ trong loadView: "Thực hiện tùy chỉnh phương pháp này của bạn không nên gọi siêu" – Eiko

+0

Đó không phải là vấn đề, nhưng cảm ơn cho ghi chú. – psychotik

+1

Điều thú vị là, tham chiếu lớp UITableViewController, "Bạn có thể ghi đè lên loadView hoặc bất kỳ phương thức siêu lớp nào khác, nhưng nếu bạn chắc chắn sẽ gọi thực hiện siêu lớp của phương thức, thường là cuộc gọi phương thức đầu tiên." – cduhn

-1

Thực hiện tải lạiData trên chế độ xem bảng có thể giúp

+0

Xin chào, cảm ơn cho -1 phiếu bầu, nhưng tôi có trong quá khứ nhìn thấy bảng xem xét chủ yếu là chính xác mất tiêu đề của họ, chỉ để được giải quyết bằng cách làm một bảng tải lại. –

0

Chiều rộng và chiều cao là gì? Có thể chúng là số không sau một cảnh báo bộ nhớ?

+0

Ý tưởng hay - Tôi đã xác minh rằng chúng hợp lệ sau khi cảnh báo bộ nhớ. – psychotik

0

đó là cách thông thường, iOS sử dụng cách này để giảm bộ nhớ, trong khi nhận được vấn đề bộ nhớ, sau đó nó sẽ giải phóng một số phần tử giao diện người dùng, cũng sẽ gọi phương thức 'didUnLoad' ... bạn phải giải phóng headerView trong phương thức 'didUnLoad', đặt thành nil, và sau đó trong phương thức 'didLoad' để tạo headerView nếu nó là nil và sau đó thêm nó vào tableView nữa .... iOS sẽ tự động miễn phí một số phần tử giao diện người dùng trong khi cảnh báo bộ nhớ khuôn mặt.

2

Tôi đã có một vấn đề tương tự với điều này, mặc dù nó dường như không giải thích tình hình của OP dựa trên mã của anh ấy; Tôi chỉ muốn đặt nó ở đây trong trường hợp bất cứ ai khác đi qua này.

Tôi giữ nguyên chế độ xem tiêu đề của mình trong một biến mẫu. Trong viewDidLoad của tôi, tôi kiểm tra xem nếu biến này là không, nếu nó là sau đó tôi tạo ra khung nhìn, giữ lại và thiết lập biến cá thể cho nó và đặt tableHeaderView cho nó. Vấn đề là tình trạng này sẽ chỉ đúng một lần, bởi vì biến cá thể của tôi sẽ không bao giờ là nil sau lần đầu tiên tôi tạo nó; tuy nhiên, thuộc tính tableHeaderView của chế độ xem bảng sẽ được đặt thành không khi có cảnh báo bộ nhớ, vì vậy sẽ không có chế độ xem tiêu đề nữa, mặc dù tôi vẫn có chế độ xem trong biến mẫu.

Giải pháp là thay đổi séc để xem thuộc tính của bảng xem có thuộc tính không (và sau đó tạo lại chế độ xem tiêu đề mỗi lần được đặt thành 0) hoặc (vì trong trường hợp này tôi vẫn có khung nhìn được giữ lại trong một biến mẫu) để di chuyển nhiệm vụ sang tableHeaderView bên ngoài khối if, do đó mỗi khi viewDidLoad được chạy, chúng tôi sẽ đảm bảo gán lại chế độ xem tiêu đề thành tableHeaderView trong trường hợp nó được đặt thành không.

+0

+1 @psychotik Về lưu lượng ứng dụng, tốt hơn là nên có mã 'headerView' trong' viewDidLoad' thay vì 'loadView':' loadView' được coi là đơn giản, khi trả về 'self.view' được đặt. Khi 'loadView' trả về,' viewDidLoad' được gọi trên lớp điều khiển, là nơi bạn có thể thiết lập các thuộc tính bổ sung. Tôi sẽ nói thực hiện các thiết lập xem tiêu đề trong 'viewDidLoad', và xóa nó trong' viewDidUnload'. – darvids0n

0

Tôi vừa gặp sự cố tương tự đã khiến tiêu đề tùy chỉnh của tôi không thể tải lại uitableview sau khi nhận được cảnh báo bộ nhớ. thực hiện hiện tại của tôi để tạo ra các tiêu đề là

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (_tableHeaderView == nil) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"DetailHeaderView" owner:self options:nil]; 
     self.tableView.tableHeaderView = _tableHeaderView; 
    } 
} 

và để khắc phục vấn đề tôi chỉ đơn giản thêm vào dòng này để didReceiveMemoryWarning tôi

_tableHeaderView = nil 

và bây giờ nó được nạp lại sau một cảnh báo bộ nhớ được gửi đi.
Xin lỗi nếu điều này đã được trả lời nhưng tôi không thấy một câu trả lời rõ ràng cho vấn đề của tôi và tôi nghĩ rằng tôi sẽ bật đây cho bất kỳ ai khác trong hoàn cảnh của tôi.

Mã hóa hạnh phúc

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