програмно спрете анимацията на uipickerview на iphone

Имам UIActionSheet, съдържащ инструмент за избор и UIToolbar. В UIToolBar има бутон за запазване. Някои от моите потребители обаче съобщиха, че са натиснали бутона за запазване, преди UIPickerView да спре да се върти, като по този начин извлича само първоначалната стойност (преди въртене).

Има ли начин да получите текущо избрания елемент от UIPickerView, след като потребителят докосне запазване или получаване на обратна връзка за активния избран елемент, докато се върти?

Благодаря


person zsniperx    schedule 30.01.2011    source източник
comment
какво имаш предвид под въртене? Единственият въртящ се елемент в потребителския интерфейс на iPhone, който познавам, е UIActivityIndicatorView   -  person Max    schedule 30.01.2011
comment
Не съм опитвал, но какво ще стане, ако направите това, докато въртите? [picker selectRow:[picker selectedRowInComponent:i] inComponent:i animated:YES]; за всеки компонент i, който имате?   -  person nacho4d    schedule 30.01.2011
comment
@Max на iPhone, можете да плъзнете надолу върху uipickerview, за да го завъртите (стил на слот машина)   -  person zsniperx    schedule 30.01.2011
comment
@nacho4d... аз отговорих същото... трябваше да отговориш вместо да коментираш... така щеше да спестиш време и на другите..   -  person yunas    schedule 25.06.2012


Отговори (7)


Дори ако отхвърлят инструмента за избор, докато той все още се върти, инструментът за избор пак ще извика делегата с последния избран ред, след като спре, дори и да не се вижда. Ако приемем, че все още не сте го освободили, можете да настроите делегирания приемник да проверява дали инструментът за избор е видим и ако не е, да запази избраната стойност.

Правя това, като предполагам, че е ясно, че потребителят не превърта до произволна стойност - обикновено, когато превърта и отхвърля, без да изчака да се установи, това означава, че е превъртял или до най-горната, или до най-долната част на списъка. Бих казал, че можете безопасно да използвате резултата от делегата в тези два случая.

person Shaun Budhram    schedule 16.06.2011
comment
Вие сте най-близкият отговор досега! Изглежда, че това е валидно решение. Моят избор обаче е в UIActionSheet, така че ще бъде освободен след натискане на бутон в лентата с инструменти на UIActionSheet, което е много вероятно да се случи, докато се върти, защото няма толкова много редове. Някакви предложения как да се заобиколи това или да спре програмно? Гласувайте все пак - person zsniperx; 18.06.2011
comment
Благодаря ти много, Шон, малко се изнервих, че не се сетих за това на първо място, но напълно ми помогна!! Още веднъж благодаря! - person crojassoto; 05.06.2014

Мислили ли сте някога да използвате метода titleForRow, за да разберете това. Докато pickerview се превърта, вашият titleForRow метод се извиква, за да попълни редовете над или под текущо гледания ред (в зависимост от посоката, в която се върти инструментът за избор). Когато инструментът за избор спре, методът didSelectRow се извиква и върнатият ред е 2 реда от последния ред, попълнен в метода titleForRow.

Мисля, че можете да изберете да спрете инструмента за избор в някакъв момент (таймери за откриване на точка, които се използват, за да кажат на кода в titleForRow да улови компонент и ред от повикването) в превъртането и след това да направите selectRow, за да зададете стойността на какво искате да бъде, след като спре да се върти (и се извика didSelectRow).

person KevinS    schedule 13.03.2011

Не мисля, че това е проблем, който ще можете да разрешите с UIPickerView сам по себе си.

Сега няма начин да разберете кой ред е избран, без анимацията да спре (и по този начин изгледът за избор да избере реда, на който е спрял). Единственият начин би бил да кажете на инструмента за избор на кой ред да спре, като използвате selectRow:inComponent:animated:, но как ще разберете кой ред е това? Не знаеш, защото пикерът се върти...

Мисля, че това е просто ограничение на UIPickerView и Apple вероятно ще го опише като очаквано поведение.

person Jasarien    schedule 31.01.2011
comment
Можете да получите текущия ред, като използвате метода selectedRowInComponent на pickerView, дори pickerView се върти. - person Ali Hamza; 20.06.2013

Имах същия проблем... Поправих го, като просто добавих следния кодов ред към метода, който затваря или избира стойността на инструмента за избор.

[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES];
person yunas    schedule 24.06.2012

Току-що намерих решение, което работи за моя случай. Нямам нужда от последното събитие за актуализиране, генерирано, когато инструментът за избор спре да се върти, след като потребителят го е отхвърлил. Така че този метод спира превъртането и не предизвиква ново събитие за избор на актуализация. Изглежда, че ще проверите дали селекциите са добре в инструмента за избор след това (не ме интересува, избирам отново стойности, когато покажа инструмента за избор).

- (void)_resetPickerViewDelegates {
    id delegate = [_pickerView.delegate retain];
    id dataSource = [_pickerView.dataSource retain];

    _pickerView.delegate = nil;
    _pickerView.dataSource = nil;
    [_pickerView reloadAllComponents];
    _pickerView.delegate = delegate;
    _pickerView.dataSource = dataSource;

    [delegate release];
    [dataSource release];    
}
person MANIAK_dobrii    schedule 25.10.2012

При щракване върху бутона "запазване" можете да извлечете избрания обект от вашия компонент чрез

[component1Array objectAtIndex:[myPicker selectedRowInComponent:1]];

където,

  • "component1Array" е NSArray или NSMutableArray, обект, който се използва за показване на обектите (сурово съдържание) във вашия компонент.
  • "myPicker" е UIPickerView обект, който показва инструмента за избор.
  • „[myPicker selectedRowInComponent:1]“ ще върне текущо избрания необработен номер от myPicker в компонент „1“.

И „[myPicker selectedRowInComponent:2]“ ще върне текущо избрания необработен номер от myPicker в компонент „2“. Можете да извлечете избрания обект от вашия компонент2 чрез

 [component2Array objectAtIndex:[myPicker selectedRowInComponent:2]];

Надявам се да работи за вас.

person Vipul Parmar    schedule 31.01.2011
comment
Проблемът е, че когато се щракне върху бутона за запазване, ако изгледът за избор все още се върти, тогава избраният ред все още не е зададен. Това все още винаги ще връща предишния избран ред, а не който и да е ред, на който изглежда, че е осветяването на селекцията, като по този начин не решава проблема. Проблемът е как човек принудително казва на изгледа за избор да избере реда, на който изглежда, че е по време на завъртане. Не мисля, че можеш. - person Jasarien; 31.01.2011

Това може да е "хак", но работи. Моят случай е малко по-различен. Използвам един UIPicker, но мога да променя кой обект е манипулация.

Проблемът ми беше, че можете да изберете един обект, да завъртите инструмента за избор и докато той завършва въртенето си, да изберете друг обект. Това, което в крайна сметка се случи, беше, че новият обект получаваше крайната стойност на това завъртане, вместо да бъде игнорирано.

Какво направих, когато настроих UIPicker, бих му дал уникален tag въз основа на обекта, който трябваше да актуализира.

- (void)updatePickerView:(UIPickerView*)pickerView
{
    ...
    pickerView.tag = [self.myObject.position integerValue];
    [pickerView selectRow:i inComponent:0 animated:NO];
}

След това, когато завърши въртенето си, проверявам, за да се уверя, че етикетът е подреден.

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        if (pickerView.tag == [self.myObject.position integerValue]) {
            ...
        }
    }

Не съм сигурен как работи от страна на Apple, но това беше достатъчно, за да работи за мен.

Като странична бележка и не съм сигурен дали това има значение, но моят UIPicker е в UITableViewCell, но тъй като това е клетка за многократна употреба и тъй като имах проблемите, които имах, предполагам, че UIPicker е същият, когато е преместен от една позиция в друга (тъй като има само един на екрана в даден момент).

person RyanJM    schedule 15.06.2015