2011-07-05 16 views
5

Mam wiele niestandardowych UIWebView jako subviews w UIScrollView. Zaimplementowałem metody dotykowe w UIViewController dla UIWebView, ale te metody nie są wywoływane.UIWebView w środku UIScrollView spożywających zdarzenia dotykowe

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { } 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { } 

Przeczytałem gdzie indziej i mówi, że UIScrollView będzie zużywać zdarzenia. Ma to sens, ale czy UIWebView nie otrzyma zdarzenia dotyku przed samym UIScrollView? Prawdopodobnie dzieje się tak, że UIWebBrowserView (wyrób podglądu UIWebView) zużywa zdarzenia. Ta klasa nie może być jednak podklasowana, więc nie mogę wysłać zdarzeń w górę łańcucha widoków do UIScrollView. Czytałem w dokumentacji Apple iOS, że nigdy nie należy umieszczać UIWebView wewnątrz UIScrollView, ale muszę to zrobić dla moich celów.

Moje pytanie brzmi: w jaki sposób moje niestandardowe UIWebView (które są subviewsami UIScrollView) otrzymują zdarzenia dotykowe?

Moi kontrolery i widoki są skonfigurowane następująco:

HomeViewController.h /.m /.xib 
HomeView.h /.m (is a UIScrollView) 
DashboardViewController.h /.m /.xib (custom UIWebView's) 

HomeViewController jest ładowany z pliku nib, który zawiera własny widok: HomeView. DashboardViewController jest ładowany z pliku Nib. Zawiera kilka etykiet, suwaków itp. (Zauważ, że nie ma tu niestandardowego widoku - nie podklasuję tutaj UIView).

HomeViewController dynamicznie ładuje kilka kontrolek DashboardViewController i dodaje swój widok do HomeView.

DashboardViewController *dashboardViewController = [[DashboardViewController alloc] initWithNibName:@"DashboardViewController" bundle:[NSBundle mainBundle]; 
[homeView addSubview:dashboardViewController.view]; 

Odpowiedz

0

Interakcja użytkownika jest standardowo włączona.

Czy połączyłeś swój widok z delegatem właściciela pliku? Czy powiązałeś swój widok z kontrolerem? I upewnij się, że łączysz odpowiednie akcje z właściwymi metodami. (CTRL Kliknij na widoku i przeciągnij znak plus na odpowiedniej metody w pliku Class.h.

@interface MyScrollView : UIViewController { 
    UIView *myFirstView; 
    UIView *mySecondView; 
    UIView *myThirdView; 
} 

@property (nonatomic, retain) IBOutlet UIView *myView; 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 

@end 
+0

Tak, delegat moich widoków jest podłączony do właściciela pliku. Co masz na myśli, wiążą mój widok z kontrolerem? Ponadto podłączyłem podklasę UIScrollView jako widok główny kontrolera. Zobacz mój zaktualizowany post; Dodałem więcej informacji, które mogą pomóc. Dzięki. – mdupls

+0

To rozwiązanie nie działa, ponieważ UIWebBrowserView (nie UIWebView) wydaje się odbierać zdarzenia dotyku. Ta klasa jednak nie może być poddana subklasie w celu zmiany funkcjonalności. – mdupls

0

Czy dla wszystkich subviews ustawiono userInteractionEnabled = YES?

+0

UserInteractionEnabled jest domyślnie włączony. – Jules

+0

Ups. Myślałem, że domyślnie NIE. contentSize na scrollView może? –

0

UIViewController dostaje dotyka * wiadomości przed UIView .UIViewController domyślnie nie przekazuje wiadomości do UIView (przez wywołanie [super touchesBegan]), więc musisz przenieść lub przesłać funkcje touchs *, jeśli twój UIView ma kontroler:

Osobiście połóż różne dotyka * metod w podklasie widoku, a nie w podklasie kontrolera widoku.

+0

Problem polega na tym, że nie podklasę UIView dla widoków, które są subviews w UIScrollView. Po prostu używam widoku wygenerowanego ze Stalówki. Zobacz mój zaktualizowany post; Dodałem więcej informacji, które mogą pomóc. Dzięki. – mdupls

0

Możesz wypróbować to, gdy otrzymasz metody dotknięć wywoływane dla UIScrollView z kolei możesz wywołać tę samą metodę dotknięć w podglądzie z przewijania.

Powiązane problemy