2016-02-11 2 views
0

Я пытаюсь изменить строки выбора после того, как окно было загружено. Сборщик был создан в xml file, но когда к нему была добавлена ​​строка, появляется ошибка (см. Ниже).Change Picker Rows после загрузки окна

Как добавить строки выбора после того, как сборщик уже добавлен?

view.xml

<!-- other parent views above --> 
<Picker id="languagePicker" selectionIndicator="true" useSpinner="true" 
            width="Ti.Platform.displayCaps.platformWidth" right="0"> 
</Picker> 

view.js

var languages = db.execute("SELECT * FROM language"); 

while(languages.isValidRow()){ 
    $.languagePicker.add(Ti.UI.createPickerRow({title:languages.fieldByName('language')})); 
    languages.next(); 
} 

Error Log:

[ERROR] Приложение разбилось с неперехваченным исключением «NSInvalidArgumentException». Причина: - [NSNull rangeOfCharacterFromSet]: непризнанные селектор направлен например 0x109f28af0 трассировки стека: 0 CoreFoundation 0x0000000109d03e4d exceptionPreprocess + 141 1 libobjc.A.dylib 0x00000001096d5deb objc_exception_throw + 48 2 CoreFoundation 0x0000000109d0c48d - [NSObject (NSObject) doesNotRecognizeSelector:] + 205 3 CoreFoundation 0x0000000109c5990a ___forwarding_ + 970 4 CoreFoundation 0x0000000109c594b8 _CF_forwarding_prep_0 + 120 5 UIKit 0x0000000106466d9c - [UILabel _contentInsetsFromFonts] + 137 6 UIKit 0x0000000106782a84 - [_ UILabelLayer updateContentInsets] + 127 7 UIKit 0x0000000106782b73 - [_ UILabelLayer updateContentLayerSize] + 50 8 UIKit 0x0000000106782ce1 - [_ UILabelLayer layoutSublayers] + 25 9 QuartzCore 0x000000010875fe70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 10 QuartzCore 0x000000010875fcee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 11 QuartzCore 0x0000000108754475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277 12 QuartzCore 0x0000000108781c0a _ZN2CA11Transaction6commitEv + 486 13 QuartzCore 0x000000010878237c _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92 14 CoreFoundation 0x0000000109c2f367 CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSE RVER_CALLBACK_FUNCTION + 23 15 CoreFoundation 0x0000000109c2f2d7 __CFRunLoopDoObservers + 391 16 CoreFoundation 0x0000000109c24f2b __CFRunLoopRun + 1147 17 CoreFoundation 0x0000000109c24828 CFRunLoopRunSpecific + 488 18 GraphicsServices 0x000000010b04bad2 GSEventRunModal + 161 19 UIKit 0x00000001061f9610 UIApplicationMain + 171 20 ISTQB 0x0000000104320de6 основной + 310 21 libdyld. dylib 0x000000010a95192d начать + 1

+0

Что произойдет, если вы не получите строку? Если я прочитаю это правильно, 'NSNull rangeOfCharacterFromSet' говорит, что вы не получаете строку назад. Кроме того, у вас нет обработчика ошибок в этом цикле для этого условия. Как написано, код просто игнорирует оператор 'while', если' language' пуст. –

ответ

0

метод picker.add() ожидает, что массив PickerRow объектов.Это работает в моем приложении:

var data = [], 
    picker = Ti.UI.createPicker(); 
data.push(
    Ti.UI.createPickerRow({ 
     title: 'Row 1' 
    })); 
data.push(
    Ti.UI.createPickerRow({ 
     title: 'Row2' 
    })); 
picker.add(data); 

См http://docs.appcelerator.com/platform/latest/#!/api/Titanium.UI.Picker-method-add

+0

Я принял этот ответ, поскольку он правильный, однако не был решением моей проблемы. Моя проблема заключалась в том, что я пытался добавить строки после отображения представления, что невозможно. Строки TL; DR должны быть добавлены до отображения представления. – Nick

+0

В моем приложении я динамически создаю сборщик и добавляю его в Android ActionBar по мере необходимости, когда пользователь меняет вкладки. Я делаю все это в коде, а не в XML. Основываясь на ошибке, я вижу, что вы работаете в iOS. Но дело остается: сделайте это в JS-коде, а не в XML, и он будет работать. Просто удалите сборщик из пользовательского интерфейса, создайте новый и добавьте его обратно в свой интерфейс с новыми строками. – skypanther

+0

Да, это правда, так как я работал над этим, он перемещал код, чтобы отобразить окно под кодом, создавшим содержимое сборщика. – Nick