답변:
iOS 6 이상에서 가능합니다. 메소드를 구현해야합니다.
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
뷰 컨트롤러에서. 당신은 거기에 당신의 유효성 검사를 수행하고 그것이 정상이라면 그때 return YES;
그렇지 않다면return NO;
PrepareForSegue가 호출되지 않습니다.
이 방법은 프로그래밍 방식으로 segue를 트리거 할 때 자동으로 호출되지 않습니다. 확인을 수행해야하는 경우 segue 수행 여부를 결정하기 위해 shouldPerformSegueWithIdentifier를 호출해야합니다.
if ([self shouldPerformSegueWithIdentifier:@"segueIdentifier" sender:nil]) { [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]; }
참고 : 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)];
}
아브라함이 말했듯 이 다음 기능에서 유효한지 확인하십시오.
- (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];
}
[super performSegueWithIdentifier:identifier sender:sender];
정말 사실입니까?
performSegueWithIdentifier:sender:
방법을, 그리고 그것의 호출 super
방법을.
로그인 등록을 위해 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);
}
Kaolin의 대답과 비슷하게, seque를 컨트롤에 유선으로 남겨두고 뷰의 조건에 따라 컨트롤의 유효성을 검사하는 것입니다. 테이블 셀 상호 작용을 시작하는 경우 userInteractionEnabled 속성을 설정하고 셀의 항목을 비활성화해야합니다.
예를 들어 그룹화 된 테이블 뷰에 양식이 있습니다. 셀 중 하나가 선택기 역할을하는 다른 tableView로 연결됩니다. 기본보기에서 컨트롤이 변경 될 때 마다이 메소드를 호출합니다.
-(void)validateFilterPicker
{
if (micSwitch.on)
{
filterPickerCell.textLabel.enabled = YES;
filterPickerCell.detailTextLabel.enabled = YES;
filterPickerCell.userInteractionEnabled = YES;
filterPickerCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
else
{
filterPickerCell.textLabel.enabled = NO;
filterPickerCell.detailTextLabel.enabled = NO;
filterPickerCell.userInteractionEnabled = NO;
filterPickerCell.accessoryType = UITableViewCellAccessoryNone;
}
}
스위프트 4 답변 :
다음은 segue를 취소하는 Swift 4 구현입니다.
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == "EditProfile" {
if userNotLoggedIn {
// Return false to cancel segue with identified Edit Profile
return false
}
}
return true
}
다른 방법은 willSelectRowAt로 tableView의 메소드를 대체하고 segue를 표시하지 않으려면 nil을 리턴하는 것입니다.
showDetails()
-부울입니다. 대부분의 경우 셀로 표현되는 데이터 모델로 구현해야합니다 indexPath
.
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if showDetails() {
return indexPath
}
return nil
}