Събитието UIButton не се обработва в 1% от времето: кого трябва да обвиня в моята верига от отговорили?

Приложението ми има тенденция понякога да губи представа кой отговарящ трябва да обработва събитие с докосване.

Моята ситуация:

  • a XIB file defining 3 views:
    • one view as the File's Owner's view
    • 2 допълнителни изгледа, които се добавят програмно към йерархията на изгледа
  • Един от подизгледите (SubviewA) има UIButton, конфигуриран да изпраща myAction: селектора към FirstResponder, когато бъде открито събитие „Touch Up Inside“
  • SubviewA знае как да се справи с myAction:

В 99% от случаите всичко върви добре. Когато потребителят докосне бутона, SubviewA се грижи за съобщението myAction: и всичко е наред. Но от време на време потребителите се оплакват, че бутонът „замръзва“ и аз всъщност го възпроизвеждах сам няколко пъти, без да мога да намеря ясен сценарий, който да го направи при поискване.

Моето разследване досега е:

  • when nothing happens when tapping the button:
    • my button detects the tap cause it gets highlighted when pressed
    • myAction: не се извиква на SubviewA
    • останалата част от потребителския интерфейс остава отзивчива

Кодът, за който говоря, е някакъв наследен код, който се опитвам да поправя. Да имаш изглед, отговарящ на събитие за един от неговите подизгледи, ми звучи като странна архитектура. Досега винаги съм използвал собственика на файла, за да се погрижа за събитията при докосване, така че посочих, че веригата на отговора е идеалният отговорник за грешката. Но не мога да намеря защо! Доколкото разбирам, тъй като бутонът не знае как да обработва съобщението и няма контролер за изглед, прикачен към него, той трябва да го препрати към своя суперизглед (ButtonA, който знае как да го обработва)!

Въпросите ми са:

  • някаква идея откъде може да идва грешката? (респондентска верига?)
  • някакъв коментар относно това дали изгледът трябва сам да управлява поведението на бутоните си или контролерът на изглед трябва да го прави?

Редактиране: Имам идея как да коригирам грешката: свържете действието на бутона директно към SubviewA, вместо да използвате FirstResponder в Interface Builder. Причината, поради която публикувах този въпрос, е да се опитам да разбера защо веригата за отговаряне не работи от време на време.


person Dirty Henry    schedule 23.02.2012    source източник
comment
Не е включен .m код: само XIB файлове, които не са много лесни за споделяне.   -  person Dirty Henry    schedule 28.02.2012


Отговори (2)


Можете ли просто да накарате SubviewA да станеFirstResponder и след това да се откажете от него, когато приключите?

person Dan    schedule 23.02.2012
comment
Моят план да поправя грешката си е да свържа действието на бутона директно към SubviewA, а не към FirstResponder в Interface Builder. Това, което искам да знам, е ЗАЩО не работи с FirstResponder. - person Dirty Henry; 24.02.2012

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

Поради тази причина ще трябва да подкласирате UIButton, за да видите докосванията. Когато правите това, не забравяйте винаги да предавате събитията на супер класа, когато приключите с тях, в противен случай UIButton няма да работи правилно. Вижте бележките за подкласове в Справочник за класове на UIControl. Също така разгледайте Control Events в тази справка, както и някои от методите за екземпляри, за да сте сигурни, че наистина трябва да уловите щрихите във вашия код. Обърнете внимание например, че UIButton наследява способността да проследява докосвания от UIControl.

person Kamar Shad    schedule 05.03.2012
comment
вашият отговор има смисъл, но пропуска смисъла на въпроса ми: моят xib файл изрично казваше на моя бутон да извика myAction на първия отговор за вътрешно събитие за коригиране. Така че защо понякога го пропуска? - person Dirty Henry; 05.03.2012