2013-06-05 7 views
5

Da ich kein Framework verwenden konnte, um ein Fotoalbum zu erstellen, versuche ich, meine eigene mit Collection View zu erstellen, aber ich blieb gleich am Anfang stecken.Umgang mit Tap-Geste in einer UICollectionView

Mein Ziel ist es, alle Bilder von meinem Web-Service in meine Sammlung anzeigen, da alle angezeigt wird, der nächste Schritt ist, wenn jemand auf eine Zelle klickt, ich kann es in einer neuen Ansicht öffnen und auch zwischen allen navigieren.

hier ist der grundlegende Code, den ich erstellt:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    [collectionController reloadData]; 
    tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:nil action:@selector(touched)]; 

    tapGesture.numberOfTapsRequired = 1; 


} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ 

    return 1; 

} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 

    return 6; 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *cellIdentifier = @"Cell"; 

    CollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    [cell.imgCollection setImageWithURL:[NSURL URLWithString:@"http://sallescds.com.br/wp-content/uploads/2012/12/xepop-300x300.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

    [cell.imgCollection addGestureRecognizer:tapGesture]; 

    return cell; 
} 

-(void)touched:(UIGestureRecognizer *)tap{ 

    NSLog(@"the touch happened"); 
} 

Danke Jungs.

Antwort

14

Ein paar Dinge sind nicht richtig in Ihrem Code:

Erste, initWithTarget:action: sollte keinen nil Wert für Ziel übergeben werden. Von the docs:

Ziel

Ein Objekt, das der Empfänger von Aktionsmeldungen vom Empfänger gesendet wird, wenn es eine Geste erkennt. Null ist kein gültiger Wert.

In Ihrem Fall sollten Sie self als Ziel übergeben, da Sie die Nachricht gesendet werden soll, um touched: auf die aktuelle Instanz der Klasse.

Zweite, der Selektor, den Sie an initWithTarget:action: übergeben haben, ist falsch. Sie haben @selector(touched) verwendet, aber Ihre Methodenimplementierung ist - (void)touched:(UIGestureRecognizer *)tap;, der Selektor ist @selector(touched:) (beachten Sie die :).

Ich würde empfehlen zu lesen this question on selectors, wenn Sie verwirrt sind.

Dritter, man kann nicht ein einziges UIGestureRecognizer auf mehrere Ansicht (siehe this SO question) befestigen.

Um es funktionieren zu lassen, könnten Sie also eine UITapGestureRecognizer pro Collection-Zelle (vielleicht in einer Unterklasse) erstellen. Oder noch besser, implementieren Sie Ihre UICollectionViewDelegate Methode collectionView:didSelectItemAtIndexPath:.

EDIT - Wie collectionView:didSelectItemAtIndexPath: implementieren:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    // Bind the collectionView's delegate to your view controller 
    // This could also be set without code, in your storyboard 
    self.collectionView.delegate = self; 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 6; 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *cellIdentifier = @"Cell"; 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    [cell.imgCollection setImageWithURL:[NSURL URLWithString:@"http://sallescds.com.br/wp-content/uploads/2012/12/xepop-300x300.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

    return cell; 
} 

// I implemented didSelectItemAtIndexPath:, but you could use willSelectItemAtIndexPath: depending on what you intend to do. See the docs of these two methods for the differences. 
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // If you need to use the touched cell, you can retrieve it like so 
    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 

    NSLog(@"touched cell %@ at indexPath %@", cell, indexPath); 
} 
+0

Verstanden, Ich reparierte bereits diese Probleme, mein Fehler, wenn ich auf Englisch meine Methoden Namen wurde zu übersetzen. Danke für die Hilfe, jetzt muss ich herausfinden, wie man das im UICollectionViewDelegate macht, weil ich keine Ahnung habe. Können Sie mir ein Beispiel oder etwas ähnliches geben? –

+0

Ok, also muss ich diese Methode aufrufen - (BOOL) collectionView: (UICollectionView *) collectionView sollteSelectItemAtIndexPath: (NSIndexPath *) indexPath; und die Geste darin erstellen? –

+2

Das ist eigentlich viel einfacher. Wenn Sie die delegates-Methode implementieren, benötigen Sie keine Gestenerkennung. Der Delegat ruft die Implementierung seiner Methoden auf, wenn eine Berührung erkannt wird. Beachten Sie, dass Sie 'shallSelect..' oder' didSelect..' nicht explizit aufrufen müssen, der Delegierte erledigt dies für Sie. –

Verwandte Themen