Utilizzando presentViewController da UIView

Io sono la creazione di una barra del titolo per la mia applicazione iOS e sto facendo questo all’interno di una UIView. L’unico problema che sto avendo è con il “tasto home”. Quando la casa viene premuto il pulsante, si deve andare alla home page, che è ViewController.

Tuttavia, non sembra come se [self presentViewController:vc animated:NO completion:NULL]; opere per UIView.

Come posso risolvere questo problema ?

- (void) createTitlebar {

    CGRect titleBarFrame = CGRectMake(0, 0, 320, 55);

    //Create the home button on the top right of the page. When clicked, it will navigate to the home page of the application
    homeButton = [UIButton buttonWithType:UIButtonTypeCustom];
    homeButton.frame = CGRectMake(275, 10, 40, 40);
    [homeButton setTag:1];
    [homeButton setImage:[UIImage imageNamed:@"homeIcon.png"] forState:UIControlStateNormal];
    [homeButton addTarget:self action:@selector(homeButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:homeButton];
}

- (IBAction)homeButtonPressed:(id)sender{

    //Transition to the submit button page
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];
    [self presentViewController:vc animated:NO completion:NULL];
}
  • Hai aggiunto il selettore a pulsante? I. e. il pulsante si conosce il metodo per eseguire? In secondo luogo, provare a utilizzare popToRootViewControllerAnimated per evitare cicli.
  • Il messaggio di errore che sto avendo è – non visibile @interfaccia per ‘Titolo’, dichiara il selettore presentViewController:animati:completamento
  • Dove si trova questo homeButtonPressed: metodo definito ? è in alcun controller di visualizzazione o qualche punto di vista ?
  • In una classe UIView
  • Assicurarsi che il ViewController è un UIViewController sottoclasse.
  • si tratta di un UIViewController sottoclasse



5 Replies
  1. 16

    Solo UIViewController può presentare un altro controller di visualizzazione, quindi se avete bisogno di mostrare un viewcontroller da vista ci sono diversi modi, uno di loro è simile a questo:

    fare un viewcontroller in cui il genitore view è situato un delegato di

    ParentView *view = [ParentView new];
    ...
    view.delegate = self;

    poi, all’interno di ParentView metodo di chiamata di quel delegato

    - (IBAction)homeButtonPressed:(id)sender {
        [self.delegate buttonPressed];
    }

    e quindi, all’interno del VC implementare

     -(void)buttonPressed {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
        [vc setModalPresentationStyle:UIModalPresentationFullScreen];
        [self presentViewController:vc animated:NO completion:NULL];
    }

    Se hai bisogno di mantenere questo codice all’interno di UIView e di evitare la delega si può fare un trucco come questo (personalmente non mi piace, ma dovrebbe funzionare)

    -(void)buttonPressed{
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        ViewController *vc = [storyboard      instantiateViewControllerWithIdentifier:@"ViewController"];
        [vc setModalPresentationStyle:UIModalPresentationFullScreen];
        [(UIViewController*)self.nextResonder presentViewController:vc animated:NO completion:NULL];
    }
    • Ricevo il messaggio di Proprietà delegato non trovato su un oggetto di tipo .. sia per la UIView e il UIViewController
    • Oh,scusate, ho dimenticato di dire questo – U fanno di questa struttura in ParentView.h come questo: @property(nonatomic,debole) id delegato
    • ora, non succede nulla
    • è (IBAction)homeButtonPressed o -(void)buttonPressed chiamato? Fatto anche u impostare la destinazione d’azione per UIButton?
    • Sto scrivendo il codice per fare delegazione UIView o il UIViewController ?
    • all’interno di UIViewController si imposta come un delegato di una UIView. Inoltre non riuscivo a trovare qualcosa del genere nel codice [homeButton addTarget:auto action:@selector(homeButtonPressed:)];? Sono u sicuro che un pulsante sa che cosa è il metodo da chiamare?
    • Ho solo aggiunto che.
    • È ora che si infrangono subito con nessun messaggio
    • Hmm, ma il codice sopra è una parte della classe UIView. L’idea è quella di creare una barra del titolo in una classe UIView e riutilizzare in altri ViewController classi. Se posso fare il ViewController un delegato di UIView, che sconfigge lo scopo di MVC
    • In altre viewcontrollers devi solo impostare loro, come delegati di questo punto di vista e in ognuna di esse è implementare il metodo -(void)buttonPressed;
    • Solo – (IBAction)homeButtonPressed:(id)sender{ [self.delegato buttonPressed];} è implementato all’interno di UIView
    • Date un’occhiata alla mia cura rispondere
    • Nel ParentView, quando ho tipo [self.delegate buttonPressed], ancora una volta mi dà un messaggio di errore che dice: Non sono noti metodo di istanza per selettore ‘buttonPressed’
    • dichiarare buttonPressed metodo in VC.h file o sostituire il codice:[self.delegato performSelector:@selector(buttonPressed:) withObject:nil];
    • appena capito. Mi mancava view.delegate = self;
    • ce l’abbiamo fatta!)
    • Perché non ti piace il trucco se funziona?
    • Grazie salva il mio tempo.

  2. 36

    Si può fare questo senza usare il delegato pattern. Qui si va

    ObjectiveC

    UIViewController *currentTopVC = [self currentTopViewController];
    currentTopVC.presentViewController......... 
    
    - (UIViewController *)currentTopViewController {
        UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
        while (topVC.presentedViewController) {
            topVC = topVC.presentedViewController;
        }
        return topVC;
    }

    Swift

    var topVC = UIApplication.sharedApplication().keyWindow?.rootViewController
    while((topVC!.presentedViewController) != nil) {
         topVC = topVC!.presentedViewController
    }
    topVC?.presentViewController........
    • Grazie Ramshad! Questo ha lavorato come un fascino.
    • siete la maggior parte del benvenuto.
    • Tizio impressionante .. Salva un giorno..
    • Hackathon saver!
    • Dopo almeno 20 delegazione modelli per presentare view controller dal mio punto di vista nella mia app, sono davvero stanco di fare questo. Quindi questa risposta è come un’oasi nel deserto per me. Grazie mille
    • Sono contento di sentire 🙂
    • Questo funziona, Grazie. Io, comunque, una situazione. c’è un modo posso sostituire il keyWindow con un viewController come topVC?

  3. 4

    Ecco una più idiomatiche Swift 3 versione di Shamsudheen risposta:

    extension UIApplication {
    
        static func topViewController() -> UIViewController? {
            guard var top = shared.keyWindow?.rootViewController else {
                return nil
            }
            while let next = top.presentedViewController {
                top = next
            }
            return top
        } 
    }

    Poi si può chiamare:

    UIApplication.topViewController()?.present(...)
  4. 2

    Si può provare sotto il codice

     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
     ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
     UIViewController *vc1 = [UIApplication sharedApplication].keyWindow.rootViewController;
     [vc1 presentViewController:vc animated:YES completion:nil]; 
  5. 1

    Con Swift 4 – 4.2
    Aggiunta su Shamsudheen TK risposta.

    var topVC = UIApplication.shared.keyWindow?.rootViewController
        while((topVC!.presentedViewController) != nil) {
            topVC = topVC!.presentedViewController
        }
        let customViewController = CustomViewController()
        topVC?.present(customViewController, animated: true, completion: nil)

    Con UINavigationController:
    Qui è anche una funzione aggiuntiva -> Si può passare lungo un UINavigationController con il customViewController.

     var topVC = UIApplication.shared.keyWindow?.rootViewController
        while((topVC!.presentedViewController) != nil) {
            topVC = topVC!.presentedViewController
        }
        let customViewController = CustomViewController()
        let navController = UINavigationController(rootViewController: CustomViewController)
        topVC?.present(navController, animated: true, completion: nil)

Lascia un commento