QDynamicDataSection в QuickDialog

В настоящее время я борюсь с QDynamicDataSection QuickDialog. Я хочу заполнить динамический раздел. Когда я запускаю следующий код, взятый из демонстрации, я получаю динамический раздел, заполненный несколькими экземплярами шаблона, т.е. «Что-то здесь». Однако я хочу получить «первое» и «второе». Как этого можно достичь?

QDynamicDataSection *section = [QDynamicDataSection new];
section.title = @"Normal: with elements";
section.bind = @"iterate:something";
section.elementTemplate = [NSDictionary dictionaryWithObjectsAndKeys:
    @"QLabelElement", @"type",
    @"Something here", @"title",
nil];
[root addSection: section];
[root bindToObject:[NSDictionary dictionaryWithObjectsAndKeys:
        [NSArray arrayWithObjects:@"first", @"second", nil], @"something",
        nil]];

ИЗМЕНИТЬ с решением:

Эдуардо наставил меня на правильный путь (и получил признание):

  1. Шаблон должен обеспечивать привязку
  2. Элементы массива для итерации должны быть ключевыми компиляторами, например, словари. (привязка к object не работает)

Следующий код работает по назначению:

QDynamicDataSection *section = [QDynamicDataSection new];
section.title = @"Normal: with elements";
section.bind = @"iterate:something";
section.elementTemplate = [NSDictionary dictionaryWithObjectsAndKeys:
    @"QLabelElement", @"type",
    @"title:name", @"bind",
nil];
[root addSection: section];

[root bindToObject:[NSDictionary dictionaryWithObjectsAndKeys:
        [NSArray arrayWithObjects:
         [NSDictionary dictionaryWithObject: @"first" forKey: @"name"],
         [NSDictionary dictionaryWithObject: @"second" forKey: @"name"], 
         nil], @"something",
        nil]];

return root; 

@Eduardo Scoz: я бы предложил принять код примера в SampleDataBuilder.m.


Второе редактирование Подход с self (см. комментарий Эдуардо) тоже работает.


person Matthias    schedule 18.06.2012    source источник


Ответы (1)


Клавиша «итерировать» просто перебирает элементы в вашем словаре и создает новый элемент на основе шаблона для каждого элемента. Он также связывает новый элемент с объектом в массиве.

Однако в вашем случае ваш шаблон не определяет никакой привязки, поэтому новый созданный элемент не имеет измененного значения. Вам нужно будет добавить что-то вроде @"bind", @"title:object". (object возвращает фактически связанный объект, поэтому вы не привязываетесь к его свойству.

person Eduardo Scoz    schedule 18.06.2012
comment
Спасибо за ответ. Однако добавление @"bind", @"title:object" в каталог шаблона просто приводит к исключению (класс не соответствует кодированию значения ключа для ключа title:object). Кроме того, код является оригинальной копией предоставленного вами примера (файл: SampleDataBuilder.m, строки 636 и далее), поэтому я не понимаю предполагаемой семантики примера. - person Matthias; 19.06.2012
comment
Моя ошибка, должно быть наоборот: @title:object, @bind, (чуть ниже строки QLabelElement). Я ненавижу то, что NSDictionary использует значение-›ключ, а не ключ-›значение. - person Eduardo Scoz; 19.06.2012
comment
Спасибо еще раз. Я уже догадался, что параметры надо поменять местами. Однако в этом случае (опять же в вашем примере кода) я снова получаю то же самое исключение, на этот раз для NSCFConstantString (в первом случае для QLabelElement). Исключение возникает в вызове bindToObject. Может, что-то не так? - person Matthias; 19.06.2012
comment
Извините, я продолжаю догадываться, не проверяя. Это должно быть название: self. Self возвращает текущий объект, привязанный к корню, а не объект. Попробуйте. Код находится здесь: github.com/escoz/QuickDialog/blob/master/ быстрый диалог/ - person Eduardo Scoz; 19.06.2012