2009-11-29 59 views
5

Tôi có một TableView xây dựng và vẽ ok, nhưng sau đó gặp sự cố khi cuộn chế độ xem. Tôi đã chạy qua trình gỡ lỗi và nó xuất hiện rằng các biến cấp lớp của tôi đang được ghi đè bằng cách nào đó để chúng không còn tồn tại khi titleForHeaderInSection được gọi lại. Điều rất lạ là nếu tôi thay thế mã:UITableView gặp sự cố khi cuộn

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = [favouritesDataSections objectAtIndex:section]; 
return sectionTitle; 
} 

với:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = @"Test"; 
return sectionTitle; 
} 

Nó vẫn treo nhưng lần này danh sách debugger không phải là một NSString khi bạn di chuột qua biến sectionTitle.

Đây là mã tôi đã sử dụng để tạo ra các quan điểm và thiết lập các biến mức lớp:

- (void)loadView { 
[super loadView]; 
CGRect tableSize = CGRectMake(0,0,320,460); 
UITableView *favouritesTableView = [[UITableView alloc] initWithFrame:tableSize style:UITableViewStylePlain]; 
favouritesTableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); 
favouritesTableView.dataSource = self; 
favouritesTableView.delegate = self; 
favouritesTableView.rowHeight = 52; 
[self.view addSubview:favouritesTableView]; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
// Get the full path of the favourites plist 
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"]; 
// Initialise Dictionary and array 
favouritesDataAll = [[NSMutableDictionary alloc] init]; 
favouritesDataSections = [[NSArray alloc] init]; 

NSDictionary *dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:filename] retain]; 
favouritesDataAll = dict; 
[dict release]; 

favouritesDataSections = [favouritesDataAll allKeys]; 
} 

Tôi sẽ hoàn toàn điên cố gắng theo dõi này xuống - dành 2 ngày trên đó cho đến nay như vậy sẽ được bên ngoài biết ơn vì sự giúp đỡ nào.

Trân trọng

Dave

+0

OK, nếu tôi đặt tại giữ lại ở phần cuối của dòng UITableView nó hoạt động trong khoảng 3 hoặc bốn lần và sau đó giao diện điều khiển cho: *** - [UISwipeGestureRecognizer dài]: chọn không được công nhận gửi đến dụ 0x43325d0 –

+0

và cũng: *** Chấm dứt ứng dụng do ngoại lệ chưa được nhận 'NSRangeException', lý do: '*** - [đối tượng NSCFArrayAtIndex:]: index (0) vượt quá giới hạn (0)' –

+0

OK, tôi sẽ tắt. Phần còn lại là cá trích đỏ mà tôi nghĩ. Đó là bởi vì tôi đã thay thế titleForHeaderInSection thành @ "Test" nó đã hoạt động được một thời gian. Lỗi giao diện điều khiển là: *** Chấm dứt ứng dụng do ngoại lệ chưa được nhận 'NSRangeException', lý do: '*** - [đối tượng NSCFArrayAtIndex:]: index (57744) vượt quá giới hạn (2)' –

Trả lời

12

OK, cố định nó ... thay đổi

favouritesDataSections = [favouritesDataAll allKeys]; 

Để:

favouritesDataSections = [[favouritesDataAll allKeys] retain]; 

Và nó tất cả dường như làm việc. Từ điều này tôi sẽ suy ra rằng mảng mà tôi đang sử dụng để lưu trữ các tiêu đề phần đã trỏ đến dữ liệu được tự động phát hành tại một số điểm ngẫu nhiên, đó là lý do tại sao nó bị chặn lại ở những nơi dường như kỳ lạ.

Tôi thừa nhận rằng tôi vẫn đang ở giai đoạn "thử và sai" về mã hóa và không hiểu đầy đủ về những gì tôi đang làm (tôi chắc chắn bạn sẽ đọc được điều này). Nó sẽ hữu ích cho tôi nếu bạn có bất kỳ ý tưởng/ý kiến ​​liên kết để đọc thêm hoặc viết về cách tất cả điều này là làm việc (tức là, khi nào và tại sao để sử dụng giữ lại, vv) để tiếp tục hiểu biết của tôi.

Cảm ơn một lần nữa, Dave

+0

Dave, hãy đọc và đọc các quy tắc quản lý bộ nhớ trong tài liệu của Apple. Đây là một sai lầm cơ bản mà bạn sẽ không thực hiện nếu bạn đã thực hiện một chút đọc trước. – NSResponder

+0

Rất hữu ích. Tôi đã có một vấn đề tương tự. Cảm ơn!!!! – saimonx

0

Âm thanh như có một số loại bộ nhớ tham nhũng xảy ra ở đây.

Một điều tôi thấy là những cuộc gọi đến [siêu ...] sẽ xảy ra sau mã khác trong các phương pháp đó.

Điều gì xảy ra nếu bạn điều chỉnh chế độ xem bảng của mình chỉ có một phần?

+0

Xin chào Greg, Cảm ơn bạn đã trả lời nhanh. Thật không may, việc đặt siêu ở cuối làm cho nó sụp đổ (tức là, TableView thậm chí không được rút ra). Tôi cũng đã thử thiết lập phần đếm theo cách thủ công thành 1, số hàng trong phần thành 1 và tiêu đề phần thành @ "Test". Vẫn treo trên cuộn giấy. –

4

Tôi muốn giới thiệu cách sử dụng setters @property để tránh vấn đề này, mảng được autoreleased, vì vậy bạn gọi một hướng dẫn giữ lại trên nó, này khắc phục được vấn đề, nhưng một sửa chữa đơn giản sẽ là sử dụng:

self.favoritesDataSection

này được tự động bởi @property (giữ lại) giữ phương tiện giữ lại được gọi là khi điều này được thiết lập, và phát hành khi nó được thiết lập để nil hay một đối tượng khác nhau.

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