9

Tôi có một kiểu đơn giản Foo đại diện cho sở thích của người dùng và đóng gói NSStringNSNumber. Tôi muốn lưu trữ một mảng các giá trị mặc định của người dùng là Foo để chúng tồn tại giữa các lần khởi chạy ứng dụng; và tôi muốn hiển thị chúng trong chế độ xem bảng để người dùng có thể thêm, xóa và chỉnh sửa chúng. Giải pháp cho điều này có vẻ khá đơn giản với các ràng buộc, nhưng điều đó chứng minh rằng tôi không thể thực sự làm việc được.Chế độ xem bảng có thể chỉnh sửa được liên kết với NSArrayController được liên kết với NSUserDefaultsController

Khi ứng dụng của tôi khởi chạy, tôi đăng ký với NSUserDefaults một kho lưu trữ được khóa của một mảng các số Foo ban đầu. Trong XIB của tôi, tôi có một bộ điều khiển mảng với mảng nội dung được liên kết với người dùng được chia sẻ mặc định là khóa điều khiển values của bộ điều khiển; với đường dẫn chính của foos; 'Kiểm soát nội dung dưới dạng giá trị hợp chất' được chọn; và NSKeyedUnarchiveFromData là biến áp giá trị. Chế độ xem bảng sau đó được liên kết với bộ điều khiển mảng và các cột của bảng với các thuộc tính của Foo.

Công cụ này hoạt động hoàn hảo khi Foo được thêm và xóa khỏi mảng — khóa foos trong mặc định của người dùng được cập nhật để phản ánh nội dung mới của mảng. Vấn đề là những thay đổi đối với các thuộc tính của một cá nhân Foo không kích hoạt tương tự mảng được ghi lại về giá trị mặc định của người dùng. Tôi tin rằng lý do cho điều này được thảo luận trong phần 'To-many Relationships' của 'Đăng ký khóa phụ thuộc' trong Hướng dẫn lập trình quan sát giá trị khóa: các thay đổi đối với mảng của bộ điều khiển mảng được quan sát, nhưng thay đổi đối với thuộc tính của các phần tử được chứa .

Mặc dù nhận ra đây là vấn đề tôi không thể cho cuộc sống của tôi tìm ra những gì để thực sự làm để thực hiện công việc này. Khi tôi quan sát thay đổi trên Foo tôi cần thông báo đối tượng nào và với thông điệp nào sao cho toàn bộ mảng được ghi lại về giá trị mặc định của người dùng— NSUserDefaults, NSUserDefaultsController, NSArrayController? Tôi muốn tài liệu của Apple không chỉ đề cập đến vấn đề này và đã cung cấp một số mã ví dụ thực tế để giải quyết nó — Tôi đã thử mọi thứ và tôi không thể tìm thấy câu thần chú.

Điều này tương tự như How to get notified of changes to models via an NSArrayController nhưng tôi không thể thực hiện bước nhảy khái niệm giữa những gì anh ấy đang làm với chế độ xem tùy chỉnh và sử dụng bind:toObject:withKeyPath:options:.

Cảm ơn! :)

+0

Điều này thực sự giống như một công việc cho CoreData không phải NSUserDefaults. –

+0

Bạn có thể xây dựng? Chỉ cần suy nghĩ về số lượng tài liệu tôi cần phải tiêu hóa để thậm chí bắt đầu triển khai điều này với CoreData khiến tôi đau đầu. Từ quan điểm của mô hình dữ liệu, những gì tôi đang cố gắng làm có vẻ cực kỳ đơn giản — vì sự phức tạp của CoreData có vẻ như quá mức cần thiết ở đây. –

+0

cài đặt mặc định của người dùng dành cho cài đặt và bạn đang cố gắng sử dụng nó để lưu trữ mô hình dữ liệu của bạn dưới dạng âm thanh của nó. CoreData thực sự không phải là rất khó khăn nếu bạn thực sự có một mô hình dữ liệu đơn giản. xcode có các mẫu dự án cho nó về cơ bản thực hiện tất cả các thiết lập cho bạn. nó cũng sẽ giải quyết vấn đề bạn mô tả. –

Trả lời

0

Tôi là nhà phát triển iOS nên hãy tha thứ cho tôi nếu có một số khía cạnh của điều này mà tôi bị thiếu do iOS không hỗ trợ các ràng buộc Cocoa.

Tôi không thể nói chắc chắn nhưng có vẻ như bạn muốn nhận thông báo khi bất kỳ thuộc tính nào của Foo được sửa đổi để bạn có thể báo hiệu thay đổi cho mảng foos của bạn và do đó NSUserDefaults làm mới mảng đã lưu. Đúng không?

Giả sử tôi hiểu kịch bản, và cho rằng, như bạn đã nói, sửa đổi chính mảng đó (nghĩa là thêm/xóa Foo bên trong 'foos' là báo hiệu thành công thay đổi, có vẻ như rõ ràng là những gì bạn cần làm là mà foos đã được cập nhật bất cứ lúc nào một tài sản cá nhân được cập nhật

Để thực hiện điều đó, bạn chỉ cần kích hoạt thông báo KVO khi bất kỳ tài sản nào thay đổi. Về cơ bản bạn sẽ ghi đè các bộ định cư của bạn bên trong Foo - cho bất kỳ thuộc tính nào bạn quan tâm và gửi thông báo đến đó

Nhưng làm thế nào để bạn làm điều này?Các mô hình thông thường để gửi một thông báo KVO đi như thế (đối với tài sản được gọi openingBalance:

[self willChangeValueForKey:@"openingBalance"]; 
_openingBalance = theBalance; 
[self didChangeValueForKey:@"openingBalance"]; 

Nhưng trong trường hợp của bạn, bạn muốn gửi một thông báo rằng tài sản 'foos' đã thay đổi Và nó không phải là một tài sản trên Foo. Không có gì nói rằng thông báo phải chỉ dành cho tài sản cụ thể (hoặc ít nhất là không có gì mà tôi biết). Nhưng, có thể bạn không muốn một Foo biết nó được cấu tạo bên trong một tài sản 'foos' ở đâu đó Tạo một phương pháp chung để kích hoạt thông báo cập nhật 'Foo' bên trong Foo - phân lớp các bộ định cư của bạn, và sau đó kích hoạt thông báo này bất cứ khi nào bạn sửa đổi một thuộc tính Foo.

Đổi lại, bên trong đối tượng sở hữu 'foos' đăng ký thông báo này và cập nhật trực tiếp NSUserDefaults hoặc từ đó, kích hoạt thông báo KVO của bạn về 'foos' ở đó.

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