iPhone: Come dire quali ScrollView chiama i metodi delegati?
-
24-09-2019 - |
Domanda
La risposta a questo è probabilmente proprio sotto il mio naso, ma non lo vedo. Forse qualcuno qui potrebbe aiutare.
Ho uno scrollview che consente lo scorrimento verticale. L'ho organizzato:
[clefScrollView addSubview:clefView];
[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
clefScrollView.showsVerticalScrollIndicator = YES;
clefScrollView.showsHorizontalScrollIndicator = NO;
clefScrollView.delegate = self;
Ho i seguenti metodi inclusi nello stesso file, al fine di supportare il protocollo UISCrollViewDelegate:
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
NSLog(@"%f %f", scrollView.contentOffset.y, scrollView.contentSize.height);
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSLog(@"scrollViewDidEndDecelerating");
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
NSLog(@"scrollViewDidEndScrollingAnimation");
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"scrollViewDidScroll");
}
Inoltre, il file .h per la mia classe include il protocollo:
@interface ClefNotesViewController : UIViewController <UIActionSheetDelegate,UIScrollViewDelegate,DoneWithVCDelegate> {
Il problema è che, non importa cosa, i seguenti due non vengono mai chiamati:
-scrollViewDidEndDecelerating
-scrollViewDidScroll
Gli altri due metodi vengono chiamati in risposta a eventi diversi. Dato che vengono chiamati due dei metodi di protocollo, suppongo di aver correttamente impostato il delegato su me stesso. Quindi qual'è il problema?
Grazie!
Aggiornamento: ho trovato il problema, anche se non ho ancora capito come risolverlo. La mia classe copre due file. Nel secondo file, un diverso ScrollView sta implementando -SCrollViewDidendDecelerating -SCrollViewDidScroll
La domanda è: come posso definire due diversi set di metodi per due diversi uiscrollviews, nella stessa classe?
Potrei provare a gestire due scrollviews con gli stessi metodi delegati, ma questo è brutto poiché non sarò in grado di conservare ogni set di delegati con il file di Scrollview. Potrei anche dividere la mia classe. C'è un altro modo?
Soluzione
La domanda è: come posso definire due diversi set di metodi per due diversi uiscrollviews, nella stessa classe?
I metodi delegati accettano un oggetto ScrollView come parametro. È necessario verificare quale ScrollView viene superato e rispondere di conseguenza. È possibile impostare la proprietà Tag di ogni ScrollView per identificarli.
Altri suggerimenti
Devi solo confrontare i puntatori con ciò che viene passato nei metodi
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if(scrollView == self.firstScrollView){
// do something
}
else if(scrollView == self.secondScrollView){
// do something else
}
}
Ciò presuppone che i tuoi scrollviews siano proprietà della classe. Sono abbastanza sicuro che un confronto puntatore vada bene qui. Se ti dà problemi a usare qualcosa di simile
if(scrollView.tag == self.firstScrollView.tag)
Dovrai assegnare loro un tag quando li crei