2012-10-19 17 views
7

Istnieje bieżący widok jako UIViewController, który wywołuje "LoginView", ale nie jestem w, jestem w klasie NSObject i chcę zadzwonić, wyświetlić inny UIViewController, który nazywa się "MapView". Jak mogę to zrobić? enter image description herejak wyświetlić UIViewController z klasy NSObject?

Problem jest podobny do powyższego zrzutu ekranu.

+1

Dwie rzeczy: Dlaczego próbujesz utworzyć instancję i wyświetlić kontroler widoku z poziomu modelu i [co próbowałeś?] (Http://www.whathaveyoutried.com) –

+0

'AppDelegate * appDelegate = (AppDelegate *) [Delegat [UIApplication sharedApplication]]; [[appDelegate loginViewController] presentViewController: mapViewController animated: YES completion: nil]; ' Próbowałem tego kodu, ale nie działało. – Hayzum

+0

Czy nazwa twojej klasy AppDelegate jest naprawdę" AppDelegate "? Co więcej, nie powinno być potrzeby prezentowania viewController z obiektu NSObject! –

Odpowiedz

2

Nie należy tworzyć instancji i wyświetlać kontrolerów widoku z poziomu modelu. Widoki powinny być napędzane według modeli.

W tym przypadku jako punkt wyjścia podałeś LoginView. Kiedy spełniony jest jakiś warunek (może się udać logowanie?) Należy odpowiednio zaktualizować bazowy model, a następnie wyświetlić MapView.

Od wewnątrz LoginView:

MapView *mapView = [[MapView alloc] init]; 

Jeśli aplikacja używa kontrolera nawigacji:

[self.navigationController pushViewController:mapView animated:YES]; 

inaczej:

[self presentViewController:mapView animated:YES completion:<nil or block>]; 
5

jestem przy założeniu, że próbujesz uzyskać dostęp do UIViewController członek z klasy UIViewController z klasy NSObject. Łatwy wystarczy przekazać element UIViewController do klasy NSObject. W tym przypadku jaźń. To, co możesz zrobić, to możesz zmieniać, edytować, usuwać, cokolwiek chcesz robić w swoim UIView z innej klasy. Oto przykład tego.

wywołanie klasy NSObject z klasy UIViewController

@implementation myViewControllerClass 

- (void) viewDidLoad { 
    //Pass in the UIViewController object, in this case itself. 
    [[myNSOBjectClass alloc] startViewController:self]; 
    .... 
} 

Następnie z NSObject

@interface myNSOBjectClass{ 
    //Global access to the view controller. 
    UIViewController *viewController; 
} 
... 

@implementation myNSOBjectClass 
... 

//function that the caller calls to pass their UIViewController object 
- (void)startViewController:(UIViewController *)callerViewController{ 
    viewController = [[UIViewController alloc]init]; 
    //puts the caller's view controller to the global member. 
    viewController = callerViewController; 
    ... 
} 

teraz masz kontroler widok na wyciągnięcie ręki!

Pozdrawiam :)!

+0

dzięki :) ale rozwiązałem ten problem wiele miesięcy temu: D – Hayzum

+0

@Lifematch Miałem ten sam problem i znalazłem tę odpowiedź naprawdę użyteczną – Alessandro

2

Wypróbuj ten kod. Pomoże ci ......

W akcji kliknij przycisk Musisz wysłać swój UINavigationController & current ViewController. Ponieważ klasa NSObject nie znalazła tego kontrolera.

W swojej przycisk akcji umieścić ten kod:

[demo login_method_called:self.navigationController withCurrentViewController:self]; 

W swojej klasie NSObject .h umieścić ten kod:

#import <Foundation/Foundation.h> 
#import "Home_ViewController.h" 

@interface Method_Action_class : NSObject 

- (void)login_method_called:(UINavigationController*)navigation withCurrentViewController:(UIViewController*) controller; 
@end 

W swojej klasie .m NSObject umieścić ten kod:

#import "Method_Action_class.h" 

@implementation Method_Action_class 

-(void)login_method_called:(UINavigationController*)navigation withCurrentViewController:(UIViewController*) controller 
{ 
    Home_ViewController *home = [[Home_ViewController alloc] initWithNibName:@"Home_ViewController" bundle:nil]; 
    [navigation pushViewController:home animated:YES]; 
} 
@end 

I zbuduj swój kod.

9

Do IBAction lub specyficznej metody zapisu to:

UIWindow *window=[UIApplication sharedApplication].keyWindow; 
UIViewController *root = [window rootViewController]; 

UIStoryboard *storyboard = root.storyboard; 
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"]; 

[root presentModalViewController:vcc animated:YES]; 
0

I stworzyli obersver w widoku klasy kontrolera i zadeklarować metodę kontrolera widoku Push i notyfikacji Post używając centrum NSNotification od NSObject podklasy i działa dobrze.

w widoku kontrolera: [[NSNotificationCenter defaultCenter] addObserver: selektor własny: @selector (dismissPickerView) name: kNotificationDismissPicker object: nil];

w podklasie NSOject: [[NSNotificationCenter defaultCenter] postNotificationName: kMoveToAchievement object: nil];

0

kiedyś jak to w moim klasy NSObject:

[[[UIApplication sharedApplication] delegate].window.rootViewController presentViewController:yourMapViewContorller animated:YES completion:nil]; 

Mam nadzieję, że jest to przydatne.

Powiązane problemy