2012-12-17 5 views
2

여러분,UIView 탭바 로직에 로그인 화면

일부 탐색 로직에 문제가 있습니다. 현재 나는 탭바 탭 응용 프로그램을 두 개 가지고 있습니다. 하지만 앞에 로그인 화면을 보여주고 싶습니다. 그래서 그것은 UIView가 될 것입니다. 다음과 같이

는 현재 코드는 다음과 같습니다

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    UIViewController *viewController1 = [[roosterViewController alloc] initWithNibName:@"roosterViewController" bundle:nil]; 
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 

    self.tabBarController = [[UITabBarController alloc] init]; 
    self.tabBarController.viewControllers = @[viewController1, viewController2]; 
    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

그래서이 간단한 tabcontroller를 푸시합니다. 글쎄, 이제 로그인 화면을 갖고 싶다. 그러면 간단히 UIView으로 바뀌어 탭바 컨트롤러를 푸시 할 수 있습니다. 그러나 나는 이것을하는 방법에 대한 논리를 보지 못합니다.

저는 모달 뷰 컨트롤러를 제시하려고 노력해 왔지만, 사실 : 탭바는 배경에로드 될 것입니다. tabbarview에서 작업하려면 사용자 이름/암호 정보가 필요하므로 작동하지 않습니다. 그때는 "로그 아웃"할 수 있어야합니다,

대표> 부하 loginViewController> 부하 TabBar의 컨트롤러

그러나 :

내 논리는있을 것이다. 그래서 나는 tabbar 컨트롤러를 파괴하고 로그인 화면을 제시해야합니다.

이 문제에 대한 의견이 있으십니까?

답변

1

은 당신이 뭔가를 할 수 있습니다 :

당신은 AppDelegate에이 준수하는 프로토콜을 만들 수 있습니다.

@protocol Authenticator <NSObject> 
@required 
- (void)authenticateWithUsername:(NSString *)username andPassword:(NSString *)password; 
- (bool)authenticated; 
@optional 
- (void)authenticationSuccess; 
- (void)authenticationFailure; 

...

@interface AppDelegate : UIResponder <UIApplication, Authenticator> 
@property (readonly, nonatomic, assign) bool loggedIn; 

...

@implementation AppDelegate 
@synthesize loggedIn = _loggedIn; 

- (void)authenticateWithUsername:(NSString *)username andPassword:(NSString *)password 
{ 
    //if success 
     _loggedIn = YES; 
    //check if app responds to the optional authenticateSuccess method 
    //call it if it does 
    //else fail 
     //do stuff 
} 

- (bool)authenticated 
{ 
    if (_loggedIn != NULL) { 
     return _loggedIn; 
    } 
    //do other stuff 
} 

...

는 그래서 용서 적절한 목표-C 규칙과 구문에 약간 퍼지입니다 몇 가지 오류가 있지만 어쨌든 그 논리와 의사 코드로 해결할 수 있습니다. 당신의 필요에 맞게 조정하십시오.

이 정보가 도움이되기를 바랍니다.

편집 :

내가 내 대답은 약간 미완성이었다고 생각한다. 당신의 질문에 대한 대답이 어떤 종류의 인증 구조와 강하게 연결되어있는 것처럼 보였습니다.앱이 인증에 너무 밀접하게 연결된 경우 인증 구조를 통해 앱의 흐름을 제어하지 않는 것이 좋습니다. 그게 내 포인트 였고,이 모든 것이 앱 대리인에서 편리하고 쉽게 사용할 수 있으므로 원하는 곳 어디에서나 이러한 메서드를 호출 할 수 있으므로 인증 논리가 어떤 뷰 컨트롤러를 표시할지 결정할 수 있습니다.

+0

마찬가지로, 프로토콜에서 로그 아웃하고 적절한 시간에 옵션 메소드에 대한 모든 해당 호출을 수행 할 수 있습니다. – Ben

+0

조금 늦었습니다. 답변으로 받아 들여지는 것을 완전히 잊었습니다. 감사! –

0

로그인 화면을 root로 설정하는 것이 좋습니다. 로그인이 성공하면 멋진 애니메이션으로 윈도우의 루트를 탭바 컨트롤러로 변경하기 만하면됩니다.

+0

나를위한 작은 코드 샘플이 있습니까? –

+0

나는 그걸 가지고 있지 않아. 어쩌면 내일 – Levi

0

바로 지금처럼 탭바를 설정하는 것이 좋지만, makeKeyAndVisible 바로 다음에 애니메이션없이 로그인보기 컨트롤러를 인스턴스화하여 표시하면됩니다.

이 방법은 일단 앱이 시작되면 사용자는 tabBarController를 보지 않고 모달로 표시된 로그인 화면 만 보게됩니다. 일단 로그인이 끝나면 간단히 로그인보기 컨트롤러를 닫고 그 아래에 메시지가 나타납니다. drumroll tabbarcontroller!

+0

하하, 나는 당신이 당신의 이야기를하는 방식을 좋아합니다. 그러나, 거기에 :하지만, 나는 모달보기 컨트롤러를 제시하려고했지만, 사실 : 탭바는 배경에로드됩니다. tabbarview에서 작업하려면 사용자 이름/암호 정보가 필요하므로 작동하지 않습니다. modalviewcontroller에서 "roosterViewController"함수를 호출 할 수있는 방법이 있습니다. –

+0

자격 증명을 가지고 로그인 VC를 닫을 때까지 viewControllers 배열을 채울 때까지 viewControllers를 비워 둘 수 있습니다. – Cocoanetics

+0

기본적으로 이렇게하십시오 : self.window.rootViewController = self.tabBarController; modalvc의 해고에? "응용 프로그램 창에 응용 프로그램 실행이 끝날 때 루트보기 컨트롤러가 있어야합니다." –

1

앞서 언급했듯이 rootView로 로그인했는데 로그인이 성공하면 다른 tabbarButtons는 다음과 같이 활성화하지 않습니다 .bool을 false로 설정 한 다음로드가 성공하면 tabbar 버튼을 사용합니다. else else '티.

login = TRUE; 


UITabBarItem *reportit = [[[[self tabBarController]tabBar]items] objectAtIndex:2]; 
[reportit setEnabled:TRUE]; 

else { 

UITabBarItem *reportit = [[[[self tabBarController]tabBar]items] objectAtIndex:2]; 
[reportit setEnabled:FALSE]; 

}이 (애니메이션 포함) 지속적으로 루트 뷰 컨트롤러를 전환하는 방법

0

Levi's answer에 확장이입니다. 그냥이 확장 추가하십시오 UIViewController 클래스에 ...

extension UIViewController 
{ 
    func transitionToRootViewController(viewController:UIViewController) 
    { 
     UIView.transitionWithView(self.view.window, 
      duration: 0.3, 
      options: UIViewAnimationOptions.TransitionCrossDissolve, 
      animations: { 
       window.rootViewController = viewController 
      }, 
      completion: nil 
     ) 
    } 
} 

(즉, 모든보기 컨트롤러 transitionToRootViewController() 사용할 수있는 방법을 만들 것입니다), 그리고 진입 뷰 컨트롤러를 전달 종료 뷰 컨트롤러에 전화 (아마도 당신은 ...)을 매개 변수로 별도의 스토리 보드를 만들어 냈습니다.

는 (기본적인 아이디어는 here에서 찍은 I 코드 비트 간략화.)을 조심 비록

을 : I는 그 선택된 인덱스 (탭) 탐색 컨트롤러를 포함 탭 바 컨트롤러를 삽입하는 코드를 시도 . 전환 애니메이션 중에는 내비게이션 컨트롤러의 탐색 모음이 상태 표시 줄 (이동 통신사, 시계, 배터리 수준)의 "언더 랩"상태가되며 전환 애니메이션이 완료된 후에야 즉시 해당 위치로 "이동"하여 끔찍한 혼란을 일으 킵니다. 효과.

는 I 탐색 제어기에 내장 된 아이 뷰 컨트롤러에 다음 코드을 첨가하여 고정 (.이 수정은 this forum에서 가져온)

override func viewWillAppear(animated: Bool) 
{ 
    super.viewWillAppear(animated) 

    self.navigationController?.navigationBar.layer.removeAllAnimations() 
    //^THIS 
} 

I가 선택하지 않은 탭 바 컨트롤러에 포함되어 있는지 여부에 상관없이 네비게이션 컨트롤러 (또는 네비게이션 바가 연결되어있는 일반 바닐라 UIViewController)로 전환 할 때마다 동일한 문제가 발생할 수 있습니다.