programing

prepareForSege 메서드에서 sege를 방지하시겠습니까?

newsource 2023. 4. 20. 21:31

prepareForSege 메서드에서 sege를 방지하시겠습니까?

에서 segue를 취소할 수 있습니까?prepareForSegue:방법?

segue 전에 몇 가지 검사를 수행하고 조건이 true가 아닌 경우(이 경우,UITextFieldis empty)는 segue를 실행하는 대신 오류 메시지를 표시합니다.

iOS 6 이상에서는 가능합니다.이 방법을 구현해야 합니다.

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

뷰 컨트롤러.거기서 검증을 하고, 괜찮다면return YES;그때가 아니면return NO;prepare For Segue는 호출되지 않습니다.

이 메서드는 프로그래밍 방식으로 세그먼트를 트리거할 때 자동으로 호출되지 않습니다.검사를 수행해야 하는 경우 segue를 수행할지 여부를 결정하기 위해 performSegueWithIdentifier를 호출해야 합니다.

주의: iOS 6을 대상으로 할 수 있는 경우 허용되는 답변이 가장 좋습니다. iOS 5를 대상으로 할 경우 이 답변으로 충분합니다.

에서의 segue 취소는 불가능할 것 같습니다.prepareForSegue당신의 논리를 바꾸라고 제안하고 싶네요performSegue메시지가 먼저 발송됩니다.

Interface Builder를 사용하여 컨트롤에 직접 segue를 배선하는 경우(예: segue를 control에 직접 링크함)UIButton)를 사용하면 리팩터링을 조금 하면 됩니다.특정 컨트롤 대신 뷰 컨트롤러에 segue를 배선합니다(오래된 segue 링크를 삭제한 다음 뷰 컨트롤러 자체에서 대상 뷰 컨트롤러로 control-drag).그런 다음 다음,IBAction제어 장치를 IBAtion에 배선합니다.그런 다음 방금 작성한 IBAtion에서 논리를 실행하고(빈 TextField를 체크하고), 거기에서 실행할지 여부를 결정할 수 있습니다.performSegueWithIdentifier프로그램적으로

Swift 3: func should PerformSegue(withIdentifier ID:문자열, 송신자:임의) -> 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를 스탠드로 배선한 상태로 둘 수 있지만 버튼을 비활성화한 상태에서 시작할 수 있습니다.다음으로 뷰 컨트롤 ala의 이벤트에 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];
}

Swift 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
}

로그인 등록을 위해 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의 답변과 유사하게, 세크는 컨트롤에 배선되어 있지만 뷰의 조건에 따라 컨트롤의 유효성을 확인하는 것입니다.테이블 셀 상호 작용에 대해 실행하는 경우 사용자를 설정해야 합니다.InteractionEnabled 속성 및 셀 내의 항목을 비활성화합니다.

예를 들어, 그룹화된 테이블 뷰에 폼이 있습니다.셀 중 하나가 선택 도구 역할을 하는 다른 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;
    }

}

른른viewviewrowrowatat로로로guegue를selectselectselectselectselectselectselectselectselectselect SelectRowAt를 선택합니다. showDetails() 정말 대단해에 표시되는 .indexPath.

 func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
        if showDetails() {
                return indexPath            
        }
        return nil
    }

언급URL : https://stackoverflow.com/questions/8066525/prevent-segue-in-prepareforsegue-method