2009-04-30 6 views
1

Ich habe UIScrollView, die Subviews (Bilder) hinzugefügt hat tun. Jedes Mal, wenn ein Benutzer ein Bild in der Bildlaufansicht berührt, wird ein Häkchen darüber gesetzt.Erfasst, welche Unteransicht in UiScrollView berührt wird, aber in einer anderen Funktion nicht darauf zugreifen kann.

NSMutableIndexSet * BilderArray; < - erklärt in .h

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event { 
if (!self.dragging) { 
    [self.nextResponder touchesEnded: touches withEvent:event]; 
    NSLog(@"Touch down"); 
    for (UITouch *touch in touches) { 

     for (int i = 1; i <= [self subviews].count; i++) 
     { 


     if(CGRectContainsPoint([[self viewWithTag:i]frame], [touch locationInView:self])){  
      NSLog(@"touched %d th view",i); 

      NSArray *subviews = [[self viewWithTag:i] subviews]; 
      UIImageView *view = nil; 

      view = [subviews objectAtIndex:0]; 

       if(view.hidden){ 
        // add the index 
        [picturesArray addIndex:i]; 
        view.hidden = NO; //check mark is shown 
       }else{ 
        [picturesArray removeIndex:i]; 
        view.hidden = YES; //check mark is not shown 
       } 



      // UIImageWriteToSavedPhotosAlbum([(UIImageView *)[self viewWithTag:i]image], nil, nil, nil); <- WORKS IF CALLED 

      } 

     } 
    } 

} 

Frage 1: ist dies der beste Weg, dies zu tun? Es scheint, als wäre die Verwendung von for (int i = 1; i < = [Selbstsubviews] .count; i ++) ziemlich langsam. Ich muss im Grunde erfassen, welche Teilansicht berührt wurde. Ich habe das nicht anders als durch jede Unteransicht

savePhotos aufgerufen und im Grunde sucht, welche der Bilder berührt wurde und speichert sie im Fotoalbum. Der Aufruf von UIImageWriteToSavedPhotosAlbum schlägt jedoch fehl. Dies ist in der gleichen Datei wie TouchesEnded. Aber wenn es in TouchesEnded aufgerufen wird, funktioniert es.

  • (IBAction) savePhotos: (id) sender {

    NSLog (@ "die Indexmenge ist% @", picturesArray);

    const NSUInteger arrayCount = BilderArray.count;

    NSUInteger * theIndexBuffer = (NSUInteger *) Calloc (BilderArray.count, sizeof (NSUInteger)); UIImageWriteToSavedPhotosAlbum ([(UIImageView *) [self viewWithTag: 0] Bild], nil, nil, nil);

    [BilderArray getIndexes: theIndexBuffer maxCount: arrayCount inIndexRange: nil];

    for (int i = 0; i < arrayCount; i ++) {

    NSLog(@"Element is %d",theIndexBuffer[i]);  
        UIImageWriteToSavedPhotosAlbum([(UIImageView *)[self viewWithTag:i]image], nil, nil, nil); <- THIS CRASHES 
    

    }

}

Frage 2: Warum ist es, dass UIImageWriteToSavedPhotosAlbum versagt ?

Antwort

2

1) Implementieren Sie ein Kind von UIImageView, statt UIImageView zu verwenden. Dann versuchen für Berührungen auf den einzelnen Subviews hören, dass Ihr O lösen sollte (n) Problem

2) etwas wahrscheinlich wird immer automatisch freigegeben wird, überprüfen Sie die Referenzzählung korrekt ist

+0

Vielen Dank für Ihre Antwort SLF! Könnten Sie angeben, was Sie meinen, indem Sie ein Kind von UiImageView implementieren? Für das AutoRelease Problem [(UIImageView *) [Self ViewWithTag: i] Bild] ist im Grunde NULL. Also self viewwithTag: Ich werde automatisch veröffentlicht? – user82383

0
  1. versuchen UIView* targetView = [self hitTest:location withEvent:nil];