prepareForSege 메서드에서 sege를 방지하시겠습니까?
에서 segue를 취소할 수 있습니까?prepareForSegue:
방법?
segue 전에 몇 가지 검사를 수행하고 조건이 true가 아닌 경우(이 경우,UITextField
is 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
'programing' 카테고리의 다른 글
정적 라이브러리의 목표 C 카테고리 (0) | 2023.04.20 |
---|---|
ASP.NET ID DbContext 혼동 (0) | 2023.04.20 |
Excel 워크시트를 CSV로 저장하는 방법 (0) | 2023.04.20 |
시작된 프로그램에 전달된 매개 변수와 함께 "start" 명령 사용 (0) | 2023.04.20 |
소비 계획에 대한 Azure 함수 시간 초과 (0) | 2023.04.20 |