2012-03-12 3 views
1

У меня очень простой прикладной тест, в котором я хочу перетаскивать файлы в объекте NSImageView.Информация о перетаскивании какао

Я уже могу получить список файлов из этого действия, но теперь я хочу сохранить эти данные в массиве, который будет доступен в представлении, используя привязки данных. Единственный у меня код, который отлично работает с привязками данных, жестко, имеет массив в AppDelegate, с которым я обращаюсь, используя Array Controller. Но тогда мои данные находятся внутри класса I, созданного для NSImageView под названием «DropView», который расширяет класс «NSImageView» и обрабатывает действие drop.

Как передать информацию о массиве, чтобы сделать привязки возможными?

Любое предложение приветствуется. Благодаря!

ответ

1

Я решил использовать синглтон в более крупном проекте. В этом меньший я сделал так:

1 - Добавить AppDelegate ссылку на подкласс (м-файл):

#import "AppDelegate.h"

2 - Вызвать метод, объявленный в AppDelegate проходящее всю необходимую информацию, как это:

[[NSApp delegate] doSomething:someInformation];

3 - Установите всю информацию от используемого метода.

4 - Сделайте привязки в интерфейсе.

0

Простой ответ заключается в том, что вы не должны хранить данные модели (массив URL-адресов файлов) в представлении.

Ваше представление должно передать список файлов другому объекту контроллера, который затем сохраняет список файлов в каком-либо объекте модели. Это то, о чем говорит MVC.

Один из способов сделать это, чтобы использовать шаблон делегата, где ваше мнение будет объявить метод протокол что-то вроде этого:

@protocol YourViewProtocol 
    - (void)imageView:(YourImageViewClass*)aView receivedDroppedURLs:(NSArray*)arrayOfURLs; 
@end 

Ваше мнение будет также иметь слабый datasource свойство:

@interface YourImageViewClass : NSImageView 
@property (weak) id <YourViewProtocol> datasource; 
@end 

Затем вы должны установить объект контроллера в качестве источника данных представления. Контроллер должен соответствовать протоколу и реализовать его метод:

@interface YourController <YourViewProtocol> 
- (void)imageView:(YourImageViewClass*)aView receivedDroppedURLs:(NSArray*)arrayOfURLs; 
@end 

Затем в методе вид, что получает падение, вы могли бы сделать что-то вроде:

- (void)receivedDroppedURLs:(NSArray*)urls 
{ 
    if([datasource conformsToProtocol:@protocol(YourViewProtocol)]) 
    { 
     [datasource imageView:self receivedDroppedURLs:urls]; 
    } 
} 

Другой способ сделать это через пользовательские привязки. Реализация привязок в пользовательском представлении несколько сложнее, и я бы рекомендовал сначала использовать шаблон делегата/источника данных, если вы не опытный разработчик Cocoa.

+0

Спасибо, Роб .. Я пытаюсь воспроизвести вашу идею здесь, но я, очевидно, что-то пропустил. Вы знаете какой-нибудь учебник, который мог бы мне помочь? Благодаря! – Apollo

+0

Проблема в том, что ваш пример выглядит как рекурсивный. У нас есть протокол с методом с параметром, который из класса, который должен соответствовать протоколу. Это правильно? – Apollo

+0

Посмотрите на «NSTableView», с которым вы, возможно, знакомы. Конструкция вышеописанных методов основана на способе, которым 'NSTableView' реализует свой протокол NSTableViewDataSource. Вы никогда не храните данные в представлении таблицы, к ним всегда обращаются либо с помощью источника данных, либо с помощью привязок Cocoa и 'NSArrayController'. –

Смежные вопросы