Приложението ми има тенденция понякога да губи представа кой отговарящ трябва да обработва събитие с докосване.
Моята ситуация:
- 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. Причината, поради която публикувах този въпрос, е да се опитам да разбера защо веригата за отговаряне не работи от време на време.