簡體   English   中英

在iPhone中的多個視圖之間導航

[英]Navigating between several views in iphone

嗨,我有三種看法,我想實現一些無效的目標。 我有一個主視圖,如果用戶按下某個按鈕,代碼將檢查是否已登錄:如果是,則直接將其發送到視圖B;如果沒有,則直接進入登錄視圖。 成功登錄后,我有以下代碼可以查看b:

incidencias =[[MisIncidencias alloc]
              initWithNibName:@"MisIncidencias"
              bundle:nil];

[self.view addSubview:incidencias.view];

事情是我想擺脫登錄視圖,因為它顯示在下面,如果用戶單擊,它會返回登錄,但是如果我添加:

[self.view removeFromSuperview];

[self.view addSubview:incidencias.view]之前或之后,我只是被重定向到主視圖;

我不知道我是否清楚地解釋了自己,但是例如在Android中,您可以先單擊“完成”,然后再調用下一個活動,然后登錄活動消失,但是在iPhone中,我不知道該怎么做。

我發現另一種解決方案是將兩個視圖一個接一個地添加,但效果並不理想:

incidencias=[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil
                  ];

    [self.view addSubview:incidencias.view];

    login=[[LoginViewController alloc]
                  initWithNibName:@"LoginViewController"
                  bundle:nil];
    [self.view addSubview:login.view];

它不能很好地工作,因為incidencias開始並且不等待登錄完成。

謝謝

編輯:感謝beOn我修改了我的代碼,添加了協議:LoginViewControllerDelegate以及viewController中的此方法:

- (void)loginSucceededFromController:(LoginViewController*)viewController {
[viewController.view removeFromSuperview];

incidencias =[[MisIncidencias alloc]
              initWithNibName:@"MisIncidencias"
              bundle:nil];

[self.view addSubview:incidencias.view];
}

在LoginViewController中我有

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:  (NSInteger)buttonIndex{

if(self.delegate)
    [self.delegate loginSucceededFromController:self]

}錯誤:語義問題:在類型'LoginViewController *'的對象上找不到屬性'delegate'

如果登錄成功,則用戶會看到警報,並且一旦單擊“確定”,就會調用上述方法。

我還應該添加什么? 我從iphone開始,我不太了解委托是什么(我來自Java)

嗯,好的,還不錯。 這是想到的第一個解決方案:

步驟1.為您的登錄視圖創建委托協議。

@protocol LoginViewControllerDelegate <NSObject>
@required
- (void)loginSucceededFromController:(LoginViewController*)viewController;
@end

步驟2.在主視圖控制器中實現協議

- (void)loginSucceededFromController:(LoginViewController*)viewController {
// TODO: we'll put something here in a second
}

步驟3.成功登錄后,從您的登錄視圖中調用委托方法

if (loginSuccess && self.delegate) {
    [self.delegate loginSucceededFromController:self]
}

步驟4.使用您已有的代碼關閉登錄視圖,並從主視圖控制器中呈現新視圖:

- (void)loginSucceededFromController:(LoginViewController*)viewController {
    [viewController.view removeFromSuperview];

    incidencias =[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil];

    [self.view addSubview:incidencias.view];
}

希望這可以解決一些問題。 遇到問題的原因是您要向視圖添加子視圖,然后立即刪除該視圖,或刪除該視圖,然后向其添加子視圖。 在上面的代碼中,您調用了視圖的控制器的委托,並且恰好擁有該視圖的超級視圖的委托首先刪除了該視圖,然后向該超級視圖添加了newView(由於缺少更好的術語)。 由於超級視圖從未刪除,因此可以顯示您的newView。

您必須使用BOOL,它可以通過全局等應用程序訪問

就像extern BOOL login; 現在,一旦登錄,請設置為YES 現在檢查

if(login == YES){

incidencias=[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil
                  ];

    [self.view addSubview:incidencias.view];

}
else{
login=[[LoginViewController alloc]
                  initWithNibName:@"LoginViewController"
                  bundle:nil];
    [self.view addSubview:login.view];
}

如果您想立即執行某些操作,並且正在使用uinavigationcontroller ...那么您可以利用

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

只需獲取self.navigationController.viewcontrollers數組的可變副本,彈出最后一個元素,它將是登錄屏幕,並在您打算將屏幕b ..移到新屏幕中,然后將該數組傳遞給此函數。 ,您現在就安全了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM