Câu trả lời:
Có thể có trong iOS 6 trở lên: Bạn phải thực hiện phương pháp
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
Trong bộ điều khiển xem của bạn. Bạn thực hiện xác nhận của mình ở đó, và nếu nó ổn thì return YES;
nếu không thì return NO;
và Chuẩn bị không được gọi.
Lưu ý rằng phương pháp này không được gọi tự động khi kích hoạt phân tách theo chương trình. Nếu bạn cần thực hiện kiểm tra, thì bạn phải gọi ShouldPerformSegueWithIdentifier để xác định xem có thực hiện segue hay không.
if ([self shouldPerformSegueWithIdentifier:@"segueIdentifier" sender:nil]) { [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]; }
Lưu ý: câu trả lời được chấp nhận là cách tiếp cận tốt nhất nếu bạn có thể nhắm mục tiêu iOS 6. Để nhắm mục tiêu iOS 5, câu trả lời này sẽ làm.
Tôi không tin rằng có thể hủy bỏ một segue trong prepareForSegue
. Tôi sẽ đề nghị chuyển logic của bạn đến điểm mà performSegue
tin nhắn được gửi đầu tiên.
Nếu bạn đang sử dụng Trình tạo giao diện để kết nối trực tiếp một điều khiển với điều khiển (ví dụ: liên kết trực tiếp một câu lệnh với a UIButton
), thì bạn có thể thực hiện việc này với một chút tái cấu trúc. Nối dây segue vào bộ điều khiển khung nhìn thay vì một điều khiển cụ thể (xóa liên kết segue cũ, sau đó kéo điều khiển từ chính bộ điều khiển khung nhìn sang bộ điều khiển khung nhìn đích). Sau đó tạo một IBAction
trong trình điều khiển chế độ xem của bạn và nối điều khiển với IBAction. Sau đó, bạn có thể thực hiện logic của mình (kiểm tra TextField trống) trong IBAction mà bạn vừa tạo và quyết định xem có performSegueWithIdentifier
lập trình hay không .
Swift 3 : func ShouldPerformSegue (định danh withIdentifier: String, sender: Any?) -> Bool
Trả về giá trị true nếu segue nên được thực hiện hoặc false nếu nó bị bỏ qua.
Ví dụ :
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
}
Ngoài ra, đó là hành vi hơi xấu khi cung cấp một nút mà người dùng không nên nhấn. Bạn có thể để segue có dây như chân đế, nhưng bắt đầu với nút bị tắt. Sau đó kết nối "chỉnh sửa" của UITextField với một sự kiện trên ala điều khiển chế độ xem
- (IBAction)nameChanged:(id)sender {
UITextField *text = (UITextField*)sender;
[nextButton setEnabled:(text.text.length != 0)];
}
Nó dễ dàng trong nhanh chóng.
override func shouldPerformSegueWithIdentifier(identifier: String,sender: AnyObject?) -> Bool {
return true
}
Như Áp-ra-ham đã nói, kiểm tra hợp lệ hay không trong chức năng sau.
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender
{
// Check this identifier is OK or NOT.
}
Và, performSegueWithIdentifier:sender:
được gọi bởi lập trình có thể bị chặn bằng cách ghi đè phương thức sau. Theo mặc định, nó không kiểm tra hợp lệ hay không -shouldPerformSegueWithIdentifier:sender:
, chúng ta có thể thực hiện thủ công.
- (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];
thực sự đúng không?
performSegueWithIdentifier:sender:
phương thức và không gọi super
phương thức đó.
Nên thực hiện phân đoạn cho đăng ký đăng nhập
-(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);
}
Tương tự như câu trả lời của Kaolin là để phần tiếp theo được nối với điều khiển nhưng xác nhận điều khiển dựa trên các điều kiện trong chế độ xem. Nếu bạn đang kích hoạt tính tương tác của ô bảng thì bạn cũng cần đặt thuộc tính userInteractionEnables cũng như vô hiệu hóa nội dung trong ô.
Chẳng hạn, tôi đã có một biểu mẫu trong chế độ xem bảng được nhóm. Một trong các ô dẫn đến một bảng xem khác hoạt động như một bộ chọn. Bất cứ khi nào một điều khiển được thay đổi trong giao diện chính, tôi gọi phương thức này
-(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;
}
}
Swift 4 Trả lời:
Sau đây là triển khai Swift 4 để hủy segue:
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
}
Một cách khác là ghi đè phương thức của bảngView bằng willSelectRowAt và trả về nil nếu bạn không muốn hiển thị segue.
showDetails()
- là một số bool. Trong hầu hết các trường hợp nên được thực hiện trong mô hình dữ liệu được biểu diễn trong ô với indexPath
.
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if showDetails() {
return indexPath
}
return nil
}