2013-09-28 12 views
8

Mam kontroler UICollectionView osadzony w kontrolerze nawigacyjnym. KolekcjaView wyświetla projekty, a każda komórka ma przejść do ekranu ProjectDetail.iOS: Komornik CollectionView nie jest wyzwalany

Po prostu nie mogę uruchomić przełącznika. Jeśli po prostu upuszczę przycisk na pasku nawigacji i podłączę się do szczegółów, to działa. Ale wyzwalanie z mojej komórki CollectionView nie.

Oto co storyboard wygląda następująco: http://cl.ly/RfcM Mam segue związał się z CollectionViewCell do ProjectDetailViewController

Oto odpowiedni kod w moim ProjectDetailViewController:

@interface ProjectCollectionViewController() { 
    NSArray *feedPhotos; 
    Projects *projects; 
} 

@end 

@implementation ProjectCollectionViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.collectionView registerClass:[FeedViewCell class] forCellWithReuseIdentifier:@"cell"]; 
    [self loadData]; 

} 

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"selected %d", indexPath.row); 
    Project *project = [projects getProject:indexPath.row]; 
    NSLog(@"project = %@", project); 
} 

- (void)loadData { 

    [self.projectLoader loadFeed:self.username 
         onSuccess:^(Projects *loadedProjects) { 
          NSLog(@"view did load on success : projects %@", loadedProjects); 
          projects = loadedProjects; 

          [self.collectionView reloadData]; 
         } 
         onFailure:^(NSError *error) { 
          [self handleConnectionError:error]; 
         }]; 
} 


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    return projects.count; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *identifier = @"cell"; 
    FeedViewCell *cell = (FeedViewCell *) [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0]; 
    UIImageView *cellImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    Project *project = [projects getProject:indexPath.row]; 
    NSString *imageUrl = [project coverPhotoUrl:200 forHeight:200]; 
    NSLog(@"imageurl =>%@", imageUrl); 
    if (imageUrl) { 
     [cellImageView setImageWithURL:[NSURL URLWithString:imageUrl]]; 
    } 
    [cell addSubview:cellImageView]; 
    cell.imageView = cellImageView; 
    return cell; 
} 

Zgaduję problem polega na tym, że podłączam komórki do CollectionView.

Każda pomoc będzie bardzo ceniona!

Odpowiedz

21

nie można utworzyć segues bezpośrednio z komórek w serii ujęć, ponieważ CollectionView jest wypełniana dynamicznie przez źródło danych. Powinieneś użyć funkcji collectionView:didSelectItemAtIndexPath: i przeprowadzić programowanie z przerwami programowymi przy użyciu performSegueWithIdentifier:sender:. Coś takiego:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    [self performSegueWithIdentifier:@"MySegueIdentifier" sender:self]; 
} 

gdzie MySegueIdentifier jest identyfikator segue określonym w serii ujęć.

+0

Czy ktoś może mi powiedzieć, co się zmieniło? Ponieważ tutaj http://www.appcoda.com/ios-collection-view-tutorial/ widać wyraźnie, że połączenie jest wykonane w 'Storyboard' i działa. – Pahnev

+0

Ta odpowiedź jest nieaktualna. Zdecydowanie możesz tworzyć segues bezpośrednio w Storyboard. –

2

Czy wykonałeś połączenie CollectionView Cell w Triggered Segues na selection?

Można również wywołać segue programowo przy użyciu [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]

w

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

3

TLDR: DLA TABLICY, nie wywołuj registerClass: forCellWithReuseIdentifier :. To nadpisuje co ustawia storyboard do komórki (w tym jak segues są obsługiwane): How to set a UILabel in UICollectionViewCell

Brief konfiguracji

  • użył storyboard
  • Utworzono nowy kontroler widoku kolekcji za pomocą szablonu Xcode, ustawienie go jako podklasy UICollectionViewController.
  • Początkowo używana była domyślna funkcja UICollectionViewCell, dodająca programowo UILabel .

Wygenerowany kod UICollectionViewController zarejestrowany komórkę w viewDidLoad:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; 

pierwszy numer: prepareForSegue: nadawca: zdarzenie nie strzelał, która doprowadziła mnie do tej odpowiedzi. Zaimplementowałem zdarzenia UICollectionViewDelegate i collectionView: didSelectItemAtIndexPath: event, a następnie programowo wywołano program segue. Naprawiłem mój pierwszy problem.

Drugie wydanie: Po przełączeniu na niestandardową komórkę zawierającą jedną etykietę. Po podpięciu wszystkiego etykieta komórki nie była wyświetlana. Po kilku kopaniu znalazłem rozwiązanie zawarte w linku u góry mojej odpowiedzi.

Trzecia kwestia i rozwiązanie: Usunięto metodę registerClass: forCellWithReuseIdentifier: line. Kiedy uruchamiałem moją aplikację, etykieta pojawiła się poprawnie, ale kiedy stuknąłem w komórkę, nazwa zdarzenia prepareForSegue: sender została wywołana dwukrotnie. Po usunięciu linii registerClass: forCellWithReuseIdentifier komórka była przetwarzana przez komórkę bezpośrednio, bez potrzeby stosowania metody delegatów. Tak się spodziewałem, że storyboard zadziała. Usunąłem kolekcję collectionView: didSelectItemAtIndexPath: event, która rozwiązała podwójne uruchamianie metody prepareForSegue: sender :. Jeśli używasz storyboardu, nie rejestruj klasy komórki. Zastępuje on tworzony scenopis.

+0

@Claude Czy wiesz, dlaczego przy użyciu collectionView: didSelectItemAtIndePath: nadpisuje, który scenariusz ustawia? – preynolds

0

Równoważny kod Swift dla podobnego pytania.

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    self.performSegueWithIdentifier(@"TargetSegway", sender: self) 
} 

Upewnij się, w przypadku, jeśli komórka ma inne poglądy nakładających „Interakcje użytkownika Włączone” jest niezaznaczone (można znaleźć tej opcji pod atrybut inspektor view/Interaction). W przeciwnym razie Twój Gest Dotknięcia zostanie pochłonięty przez nakładający się widok, didSelectItemAtIndexPath może nie zostać wywołany.