에서 segue를 취소 할 수 있습니까 prepareForSegue:
방법 있습니까?
segue 전에 검사를 수행하고 조건이 true가 아닌 경우 (이 경우 일부 UITextField
가 비어있는 경우) segue를 수행하는 대신 오류 메시지를 표시하십시오.
답변
iOS 6 이상에서 가능합니다. 메소드를 구현해야합니다.
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
뷰 컨트롤러에서. 당신은 거기에 당신의 유효성 검사를 수행하고 그것이 정상이라면 그때 return YES;
그렇지 않다면return NO;
PrepareForSegue가 호출되지 않습니다.
이 방법은 프로그래밍 방식으로 segue를 트리거 할 때 자동으로 호출되지 않습니다. 확인을 수행해야하는 경우 segue 수행 여부를 결정하기 위해 shouldPerformSegueWithIdentifier를 호출해야합니다.
답변
참고 : iOS 6을 타겟팅 할 수있는 경우 허용되는 답변이 최선의 방법입니다. iOS 5를 타겟팅하는 경우이 답변이 적합합니다.
의 segue를 취소 할 수 있다고 생각하지 않습니다 prepareForSegue
. 나는 당신의 논리를performSegue
메시지가 처음 전송 .
Interface Builder를 사용하여 segue를 컨트롤에 직접 연결하는 경우 (예 : segue를 a에 직접 연결 UIButton
) 약간의 리팩토링으로이를 수행 할 수 있습니다. segue를 특정 컨트롤 대신보기 컨트롤러에 연결합니다 (이전 segue 링크를 삭제 한 다음보기 컨트롤러 자체에서 대상보기 컨트롤러로 control- 드래그). 그런 다음 IBAction
뷰 컨트롤러에서를 만들고 컨트롤을 IBAction에 연결하십시오. 그런 다음 방금 만든 IBAction에서 논리 (빈 텍스트 필드 확인)를 수행하고 performSegueWithIdentifier
프로그래밍 방식으로 여부를 결정할 수 있습니다 .
답변
스위프트 3 : func shouldPerformSegue (식별자 식별자 : 문자열, 발신자 : Any?)-> Bool
segue를 수행해야하는 경우 true 를, 무시해야하는 경우 false를 리턴합니다 .
예 :
var badParameters:Bool = true
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if badParameters {
// your code here, like badParameters = false, e.t.c
return false
}
return true
}
답변
또는 사용자가 누르지 말아야 할 버튼을 제공하는 것은 다소 나쁜 행동입니다. segue를 스탠드로 유선 상태로 둘 수 있지만 버튼을 비활성화 한 상태에서 시작하십시오. 그런 다음 UITextField의 “editingChanged”를 뷰 컨트롤의 이벤트에 연결하십시오.
- (IBAction)nameChanged:(id)sender {
UITextField *text = (UITextField*)sender;
[nextButton setEnabled:(text.text.length != 0)];
}
답변
신속하게 쉽습니다.
override func shouldPerformSegueWithIdentifier(identifier: String,sender: AnyObject?) -> Bool {
return true
}
답변
아브라함이 말했듯 이 다음 기능에서 유효한지 확인하십시오.
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender
{
// Check this identifier is OK or NOT.
}
또한, performSegueWithIdentifier:sender:
프로그래밍에 의해 호출되는 것은 다음 방법을 덮어 써서 차단 될 수 있습니다. 기본적으로에 의해 유효 여부를 확인 -shouldPerformSegueWithIdentifier:sender:
하지 않고 수동으로 할 수 있습니다.
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
// Check valid by codes
if ([self shouldPerformSegueWithIdentifier:identifier sender:sender] == NO) {
return;
}
// If this identifier is OK, call `super` method for `-prepareForSegue:sender:`
[super performSegueWithIdentifier:identifier sender:sender];
}
답변
로그인 등록을 위해 Segue를 수행해야합니다
-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
[self getDetails];
if ([identifier isEqualToString:@"loginSegue"])
{
if (([_userNameTxtf.text isEqualToString:_uname])&&([_passWordTxtf.text isEqualToString:_upass]))
{
_userNameTxtf.text=@"";
_passWordTxtf.text=@"";
return YES;
}
else
{
UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Invalid Details" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:nil];
[loginAlert show];
_userNameTxtf.text=@"";
_passWordTxtf.text=@"";
return NO;
}
}
return YES;
}
-(void)getDetails
{
NSArray *dir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dbpath=[NSString stringWithFormat:@"%@/userDb.sqlite",[dir lastObject]];
sqlite3 *db;
if(sqlite3_open([dbpath UTF8String],&db)!=SQLITE_OK)
{
NSLog(@"Fail to open datadbase.....");
return;
}
NSString *query=[NSString stringWithFormat:@"select * from user where userName = \"%@\"",_userNameTxtf.text];
const char *q=[query UTF8String];
sqlite3_stmt *mystmt;
sqlite3_prepare(db, q, -1, &mystmt, NULL);
while (sqlite3_step(mystmt)==SQLITE_ROW)
{
_uname=[NSString stringWithFormat:@"%s",sqlite3_column_text(mystmt, 0)];
_upass=[NSString stringWithFormat:@"%s",sqlite3_column_text(mystmt, 2)];
}
sqlite3_finalize(mystmt);
sqlite3_close(db);
}