2016-06-29 4 views
0

Ich habe eine UITableViewCell Unterklasse, in der jede der Tabellenzellen eine UICollectionView mit mehreren UIcollectionViewCell s enthält.So verwenden Sie Segue, wenn UICollectionViewCell ausgewählt ist

Ich brauche, wenn alle collectionViewCell angeklickt wird, muss ein neuer ViewController geöffnet werden.

Ich habe unten Methode überschrieben,

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

Wie ich ganze Kollektion in UITableViewCell Unterklasse implementiert haben, so bin ich nicht in der Lage [self performSegueWithIdentifier:@"NewViewController" sender:self];

ich versucht habe zu nennen prepareForSegue in der gleichen Klasse, aber es lädt neue Viewcontroller vor didSelectItemAtIndexPath Methode.

Antwort

0

In Ihrem UITableViewCell Unterklasse

@protocol MyUITableViewCellDelegate <NSObject> 
-(void)selectedCell; 
@end 


@interface MyUITableViewCell : UITableViewCell 
.... 
.... 
@property(nonatomic, weak) id<MyUITableViewCellDelegate>delegate; 
.. 
.. 
@end 

In Ihrem View-Controller für jede UITableViewCell setzen

cell.delegate = self; 

Für Ihre SomeViewController.m Datei

@interface SomeViewController : UIViewController<MyUITableViewCellDelegate>{ 
..... 
} 

@end 

@implementation SomeViewController 
..... 
...... 
-(void)selectedCell{ 
    [self performSegueWithIdentifier:@"NewViewController" sender:self];// The segue with identifier 'NewViewController' should be from SomeViewController to the desired view controller. 

} 
..... 
@end 

Und nennen selectedCell wie diese

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
    [self.delegate selectedCell]; 
} 

Ich denke, das wird Ihre Probleme lösen.

+0

ja das löst mein Problem. Danke @Zartha –

+0

@AhmadNauman Glückliche Kodierung! – Zartha

0

können Sie diesen Code verwenden

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
    YourViewController *newView = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"NewViewController"]; 
    [self.navigationController pushViewController:newView animated:YES]; 
} 
+0

'navigationController' Eigenschaft ist in' UITableViewCell' Unterklasse –

+0

In AppDelegate // AppDelegate.h @property (nonatomic, stark) UINavigationController * NavController nicht verfügbar; In didFinishLaunch [Fenster setRootViewController: navController]; Und verwenden Sie diese UINavigationController * navController = Fenster.rootViewController; und navController in Ihrer Tabellenansichtszelle verwenden. – Pushkraj

0

Sie nicht [self performSegueWithIdentifier:@"NewViewController" sender:self]; von innen UITableViewCell nennen können, die für Sie der Fall zu sein scheint, als performSegueWithIdentifierUIViewController Methode ist, so logisch Sie diese Funktion in UIViewController anrufen müssen.

Sie müssen Setup-Protokoll und rufen Sie die Methode das Feuer von innen die UITableViewCell-UIViewController, so etwas wie dieses

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
    [self.delegate cellDidSelect:indexPath]; 
} 

Und in UIViewController wo Sie UITableView haben nur

-(void)cellDidSelect:(NSIndexPath*)indexPath{ 
    [self performSegueWithIdentifier:@"NewViewController" sender:self]; 
} 

oder Griff, Verwenden Sie die UIViewController-Referenz als Eigenschaft in der UITableViewCell, und rufen Sie direkt wie

auf

Ich hoffe, es hilft Ihnen. Prost.

+0

Ich erhalte diesen Fehler 'Beenden App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: 'Empfänger () hat keinen Übergang mit Bezeichner' NewViewController''', wenn ich es von UIViewController aufrufen. Als Bezeichner ist richtig hinzugefügt und in anderen ViewControllern arbeiten –

Verwandte Themen