[ios] PrepareForSegue 메소드에서 segue를 방지 하시겠습니까?

에서 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);

}