[英]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.