2013-06-14 4 views
5

Xcode 4.6.1 iOS 6 utilizzano storyboardè possibile Segue da un UITableViewCell su un UIView ad un'altra vista

Il mio problema è questo

Ho un UITableView con celle prototipo dinamici su un UIView in un UIViewController (che è incorporato in un controller di navigazione) e voglio passare da una cella specifica a un'altra vista

(Prima che qualcuno suggerisca che dovrei usare un UITableViewController, ho altre cose su UIView, quindi io Sono impostato in questo modo per un motivo.)

Ora io non sono sicuro di come fare per creare la segue

Se mi trascino dal prototipo UITableViewCell per creare un segue, tutte le cellule generate chiamano automaticamente il la segue - quando ho bisogno unico a farlo. Questo è un comportamento normale e vorrei ovviare a questo se usassi un UITableViewController creando il seguito trascinando da UITableViewController e chiamando [self performSegueWithIdentifier: .... dal mio didSelectRowAtIndexPathMethod in modo che solo la cella specifica che voglio eseguire questo segue lo inneschi .

Non ho un UITableViewController in questo caso - solo la mia UITableView su un UIView che fa parte di una sottoclasse UIViewController

Ho giocato in giro e ho appena scoperto che non riesco a trascinare dal UITableView - Non ti permette di farlo, quindi era un deadend.

La mia unica scelta che sembrava a sinistra per me è stato quello di trascinare dal UIViewController

Così ho provato e, naturalmente, XCode tiri su un errore sulla linea segue eseguire mi dice che ho ... Nessuna interfaccia visibile per 'LocationTV' dichiara il selettore performSegueWithIdentifier. LocationTv è la mia sottoclasse tableview.

Qual è il modo corretto per tentare di chiamare la nuova vista in questa situazione

Grazie

Simon

risposta

3

mia soluzione

ho finito per usare un modello di delega

ho fatto un segue trascinandoli dalla mia UIViewController - in particolare il trascinamento dall'icona viewController (il cerchio arancione con un quadrato bianco in esso - dalla barra dei nomi che è sotto la vista nello storyboard, anche se potresti anche trascinare dalla barra laterale alla vista che volevo seguire.

Avevo bisogno di attivare questo seguito da una cella vista tabella su una vista tabella.

TableView Bit

Così ho dichiarato un protocollo nel mio file di intestazione Tableview - che si chiama LocationTV.h - come segue

@protocol LocationTVSegueProtocol <NSObject> 

-(void) makeItSegue:(id)sender; 

@end 

Qui di seguito che dichiaro una proprietà di tenere un mio delegato

@property (nonatomic, strong) id<LocationTVSegueProtocol> makeSegueDelegate; 

Per attivare effettivamente il seguito ho chiamato makeItSegueMethod sul mio makeSequeDelegate nel mio didSelectRowAtInd Metodo exPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

switch (indexPath.section) { 
     DLog(@"selected row %d",indexPath.row); 
    case dLocation: 
    { 
     if(indexPath.row == 2){ 

      [_makeSegueDelegate makeItSegue:self]; 

     } else if (indexPath.row == 7){ 

UIViewController Bit

e impostare il mio UIViewController (chiamato MultiTableHoldingVC) come applicazione di tale protocollo

@interface MultiTableHoldingView : UIViewController  
            <EnviroTVProtocol,LocationTVSegueProtocol> { 

} 

seguito che ho dichiarato il metodo di protocollo nella lista delle mie classi metodi (anche se non sono sicuro che sia necessario in quanto il compilatore dovrebbe conoscere il metodo in quanto la decalrazione dell'implementazione di un protocollo è essenzialmente una promessa per implementare questo metodo)

-(void) makeItSegue:(id)sender; 

e poi sopra nel file di implementazione della mia UIViewController ho scritto il metodo che essenzialmente solo chiama preformSegueWithIdentifier

-(void) makeItSegue:(id)sender{ 
    [self performSegueWithIdentifier:@"ChooseCountryNow" 
           sender:sender]; 
} 

E per collegare tutto insieme, come nel file di intestazione che avevo dichiarato il mio esempio del tableView come segue

@property (strong, nonatomic) IBOutlet LocationTV *dsLocationTV; 

ho dovuto impostare la proprietà viste le tabelle delegato ad essere auto - che ho fatto nei miei UIViewControllers - (void) viewDidLoad metodo

_dsLocationTV.makeSegueDelegate = self; 

Sembra tutto un po 'un kludge chiamare un metodo da chiamare un metodo e allprog suggerimento è più semplice (non posso per la vita di me capire il motivo per cui ha gettato gli errori per me), ma questo funziona bene . Grazie ad entrambi allprog e danypata per i loro suggerimenti.

Spero che questo sia utile a qualcuno là fuori

0

performSegueWithIdentifier: è un metodo della classe UIViewController. Non puoi chiamarlo su un'istanza UITableView. Fai in modo che il tuo controller di visualizzazione implementa il protocollo UITableViewDelegate e lo imposta come delegato per UITableView.

Un'altra opzione è che non si utilizzano segues.Nello stesso metodo delegato do:

OtherViewController ov = [[OtherViewController alloc] init<<some initializer>>]; 
// Or in case of storyboard: 
OtherViewController ov = [self.storyboard instantiateViewControllerWithIdentifier:@"ovidentifier"]; 

// push view controller 
[self.navigationController pushViewController:ov animated:YES]; 

Se l'oggetto delegato è diverso dal controller della vista, quindi la soluzione più semplice è quella di aggiungere un debole struttura alla classe del delegato che mantiene un riferimento al viewController, come questo:

@property (weak) UIViewController *viewController; 

e configurarlo nel viewDidLoad del viewController

- (void) viewDidLoad { 
    self.tableView1.viewController = self; 
} 

Assicurarsi che la proprietà tableView1 viene dichiarata in questo modo:

@property (IBACTION) (weak) SpecialTableView *tableView1; 

A volte usando lo storyboard è più doloroso di scrittura del codice da soli.

+0

My tableview è già il proprio UITableViewDelegate. (Ho 4 diverse visualizzazioni di tabella che ho usato un UISegmentedCntrol per cambiare le proprietà nascoste di on e off in modo che ne venga visualizzato solo uno alla volta. - è uno di quei tableview che devono chiamare la nuova vista). Questo significa che è necessario spostare tutte le risorse delegate da UITableView su UIViewController su cui è seduto? – SimonTheDiver

+0

Quindi hai creato classi UITableView specializzate. Queste classi devono avere un modo per accedere a ViewController in cui sono in esecuzione o è necessario creare un'implementazione simile a quella proposta dall'altra risposta. Vorrei andare per semplicità e creare una proprietà (chiamiamola 'viewController') sulle sottoclassi di UITableview che contengono un riferimento a ViewController. In 'didSelectRowAtIndexPath:' puoi chiamare '[self.viewController performSegueWithIdentifier: identificatore]'. La proprietà 'viewController' dovrebbe essere impostata in' viewDidLoad' del tuo controller di visualizzazione. – allprog

+0

Ho definito un protocollo (con metodo per chiamare performSegue) all'interno di mytableView.Ho reso la mia sottoclasse UIViewContoller conforme ad essa. Simile al danypata suggerito. Lavorato. La tua idea sembra più semplice e voglio provarla. Ho importato la classe UIViewController - #import "MultiTableHoldingView.h" nella sottoclasse UItableView ma quando ho provato a dichiararlo nell'interfaccia della mia sottoclasse tableView- @property (nonatomic, strong) MultiTableHoldingView * theParentViewController; -i errori get2: la proprietà con attributo retain (o strong) deve essere disattivata tipo di oggetto e nome di tipo sconosciuto "MultiTableHoldingView". idee? – SimonTheDiver

5

Prima di tutto segues può essere utilizzato solo tra UIViewControllers. Quindi, nel caso in cui si desideri eseguire un passaggio tra due viste che si trovano sullo stesso controller di visualizzazione, è impossibile.

Ma se si desidera eseguire un passaggio tra due controller di vista e il seguito dovrebbe essere attivato da un'azione da una vista (all'interno di una prima vista di controllo) bene che è possibile.

Quindi nel tuo caso, se ho capito la domanda, vuoi eseguire un seguito quando viene toccata la prima cella di un UITableView all'interno di un oggetto personalizzato UIView. L'approccio più semplice sarebbe quello di creare un delegato sulla vostra abitudine UIView che sarà attuato dal vostro UIViewController che contiene il costume UIView quando il metodo delegato è chiamato è necessario eseguire la segue, ecco un breve esempio:

YourCustomView. h

@protocol YourCustomViewDelegate <NSObject> 

-(void)pleasePerformSegueRightNow; 

@end 

@interface YourCustomView : UIView { 
    UITableView *theTableView; //Maybe this is a IBOutlet 
} 
@property(weak, nonatomic) id<YourCustomViewDelegate>delegate; 

YourCustomview.m

@implementation YourCustomview 
@ synthesise delegate; 

//make sure that your table view delegate/data source are set properly 
//other methods here maybe 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if(indexPath.row == 0) { //or any other row if you want 
     if([self.delegate respondsToSelector:@selector(pleasePerformSegueRightNow)]) { 
      [self.delegate pleasePerformSegueRightNow]; 
     } 
    } 
} 

YourTableViewController.h

@interface YourTableViewController : UIViewController <YourCustomViewDelegate> { 
    //instance variables, outlets and other stuff here 
} 

YourTableViewController.m

@implementation YourTableViewController 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    YourCustomView *customView = alloc init.... 
    customView.delegate = self; 
} 

-(void)pleasePerformSegue { 
    [self performSegueWithIdentifier:@"YourSegueIdentifier"]; 
} 

È possibile creare tutti i metodi per il delegato o si può personalizzare il comportamento, questo è solo un semplice esempio di come si può fallo.

+0

Ciao danypata - sono riuscito a ottenere un pezzo di codice funzionante definendo un protocollo nella sottoclasse UITableView e rendendo UIViewController conforme al protocollo e usando un metodo simile al tuo suggerito pleasePerformSegueto chiama il metodo performSegue sul fatto che sono stato confuso dalla tua risposta in quanto non sottoclassi l'UIView su UIViewController ma ci sono arrivato alla fine quindi applausi per quel – SimonTheDiver

+0

@SimonTheDiver se una delle due risposte pubblicate per la tua domanda, è quella giusta, contrassegnala come accettata, o se ne hai una migliore, postala e contrassegna come accettato;) – danypata

+0

Non preoccuparti - lo farò - I sto solo cercando di vedere se riesco a far sì che i suggerimenti di allprog funzionino prima di plumpare per uno o l'altro o di fare un esempio di codice dettagliato anch'io – SimonTheDiver