Tôi hiện đang triển khai khôi phục/khôi phục trạng thái tự động trong ứng dụng chỉ dành cho iOS6.Cuộc gọi lạ đến modelIdentifierForElementAtIndexPath: inView: (UIDataSourceModelAssociation)
Đối với một sự phục hồi của một cái nhìn bảng, tôi đã thêm giao thức UIDataSourceModelAssociation
để điều khiển xem bảng của tôi và thực hiện
- (NSString *)modelIdentifierForElementAtIndexPath:(NSIndexPath *)idx inView:(UIView *)view
và
- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view
Khi nhấn nút home, các phương pháp bảo quản nhà nước, bao gồm modelIdentifierForElementAtIndexPath:iView:
, được gọi là dự kiến và trả lại chuỗi định danh hợp lệ cho các đường dẫn chỉ mục đã cho.
Khi giết ứng dụng và khởi chạy lại, khôi phục trạng thái hoạt động nhiều hơn hoặc ít hơn. I E. ứng dụng sẽ mở lại chế độ xem bảng chính xác. Tuy nhiên, chế độ xem bảng luôn được cuộn lên trên cùng, ngay cả khi nó được cuộn đến vị trí khác trước đó.
Dưới đây là việc triển khai các phương pháp UIDataSourceModelAssociation
trong bộ điều khiển chế độ xem bảng của tôi. Không có gì lạ mắt xảy ra ở đó (các NdlFriend::accountUid
tài sản trả về một chuỗi định danh duy nhất cho một kỷ lục NdlFriend nhất định):
#pragma mark - UIDataSourceModelAssociation
- (NSString *)modelIdentifierForElementAtIndexPath:(NSIndexPath *)idx inView:(UIView *)view
{
NSString* identifier = nil;
NSArray* content = self.contentArray;
// Sometimes idx might be nil...
if(idx && idx.row<content.count)
{
NdlFriend* friend = content[idx.row];
identifier=friend.accountUid;
}
return identifier;
}
- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view
{
NSIndexPath * indexPath=nil;
NSArray* content = self.contentArray;
NSInteger count = content.count;
for(NSInteger i=0;i<count;i++)
{
NdlFriend* friend = content[i];
if([identifier isEqualToString:friend.accountUid])
{
indexPath = [NSIndexPath indexPathForRow:i inSection:0];
break;
}
}
return indexPath;
}
tôi đặt chia điểm trong cả hai phương pháp.
Để kiểm tra các phương pháp, tôi đã mở chế độ xem bảng và cuộn xuống một chút. Sau đó, khi nhấn nút trang chủ:
modelIdentifierForElementAtIndexPath:inView:
được gọi một lần, với đường dẫn chỉ mục của hàng hiển thị hàng đầu. Phương thức trả về giá trị đúng cho hàng này.
Cho đến nay rất tốt.
Sau đó, tôi dừng và khởi chạy lại ứng dụng. Dưới đây là những gì xảy ra (tôi đặc biệt là bối rối bởi các điểm break hit đầu tiên):
modelIdentifierForElementAtIndexPath:inView:
được gọi là, vớinil
như con đường index (lập luận xem có chứa con trỏ đúng đắn về xem bảng).indexPathForElementWithModelIdentifier:inView:
được gọi bằng chuỗi số nhận dạng hợp lệ (và đường dẫn chỉ mục hợp lệ được phương thức trả về).indexPathForElementWithModelIdentifier:inView:
được gọi lại (với cùng chuỗi nhận dạng).- Chế độ xem bảng được làm mới, nhưng được cuộn lên trên cùng.
Có ai biết, tại sao việc khôi phục vị trí cuộn không thành công? Có thể cuộc gọi của modelIdentifierForElementAtIndexPath:inView:
với nil
vì indexPath có liên quan đến nó (hoặc là hành vi bình thường này).
Trong khi khôi phục vị trí cuộn xem bảng (chủ yếu) hoạt động ngay trong iOS 9, hành vi bị hỏng được mô tả trong câu hỏi có 'modelIdentifierForElementAtIndexPath: inView:' _gets được gọi, với nil dưới dạng chỉ mục path_ đôi khi xảy ra khi chế độ xem bảng trống khôi phục, dẫn đến một ngoại lệ _bad access_. Một cách giải quyết khác là thay đổi chữ ký phương thức để chấp nhận một nillable 'NSIndexPath!' Và bảo vệ chống lại 'nil' (bằng cách trả về' nil'), mặc dù nó ** sẽ không bao giờ xảy ra **! (Ngoài ra, để tránh cảnh báo, trả về 'nil' nếu' numberOfRowsInSection (0) 'là số không cũng hoạt động.) – penfold