Jawaban:
Itu dimungkinkan di iOS 6 dan yang lebih baru: Anda harus menerapkan metode ini
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
Di controller tampilan Anda. Anda melakukan validasi di sana, dan jika OK maka return YES;
jika tidak maka return NO;
dan prepForSegue tidak dipanggil.
Perhatikan bahwa metode ini tidak dipanggil secara otomatis ketika memicu segues secara terprogram. Jika Anda perlu melakukan pemeriksaan, maka Anda harus memanggil shouldPerformSegueWithIdentifier untuk menentukan apakah akan melakukan segue.
if ([self shouldPerformSegueWithIdentifier:@"segueIdentifier" sender:nil]) { [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]; }
Catatan: jawaban yang diterima adalah pendekatan terbaik jika Anda dapat menargetkan iOS 6. Untuk menargetkan iOS 5, jawaban ini akan berlaku.
Saya tidak percaya mungkin untuk membatalkan segue di prepareForSegue
. Saya akan menyarankan untuk memindahkan logika Anda ke titik bahwa performSegue
pesan pertama kali dikirim.
Jika Anda menggunakan Interface Builder untuk memasang segue langsung ke kontrol (mis. Menghubungkan segue langsung ke a UIButton
), maka Anda dapat melakukannya dengan sedikit refactoring. Kawat segue ke pengontrol tampilan alih-alih kontrol tertentu (hapus tautan segue lama, lalu seret-kontrol dari pengontrol tampilan itu sendiri ke pengontrol tampilan tujuan). Kemudian buat IBAction
di controller tampilan Anda, dan kirim kontrol ke IBAction. Kemudian Anda dapat melakukan logika Anda (periksa TextField kosong) di IBAction yang baru saja Anda buat, dan putuskan di sana untuk performSegueWithIdentifier
diprogram atau tidak .
Swift 3 : func shouldPerformSegue (withIdentifier identifier: String, sender: Any?) -> Bool
Mengembalikan nilai true jika segue harus dilakukan atau salah jika harus diabaikan.
Contoh :
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
}
Atau, perilaku yang agak buruk untuk menawarkan tombol yang tidak boleh ditekan pengguna. Anda dapat membiarkan kabel segue berdiri, tetapi mulai dengan tombol dinonaktifkan. Kemudian kirimkan "editingChanged" ke UITextField ke acara dengan kontrol tampilan ala
- (IBAction)nameChanged:(id)sender {
UITextField *text = (UITextField*)sender;
[nextButton setEnabled:(text.text.length != 0)];
}
Mudah dalam gerakan cepat.
override func shouldPerformSegueWithIdentifier(identifier: String,sender: AnyObject?) -> Bool {
return true
}
Seperti kata Abraham, periksa valid atau tidak dalam fungsi berikut.
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender
{
// Check this identifier is OK or NOT.
}
Dan, yang performSegueWithIdentifier:sender:
dipanggil oleh pemrograman dapat diblokir dengan menimpa metode berikut. Secara default, ini tidak memeriksa valid atau tidak oleh -shouldPerformSegueWithIdentifier:sender:
, kita bisa melakukannya secara manual.
- (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];
benar?
performSegueWithIdentifier:sender:
metode, dan tidak memanggil super
metode itu.
Harus Melakukan Segue untuk Masuk Daftar
-(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);
}
Mirip dengan jawaban Kaolin adalah membiarkan kabel terhubung ke kontrol tetapi memvalidasi kontrol berdasarkan kondisi dalam tampilan. Jika Anda mengaktifkan interaksi sel tabel maka Anda juga perlu mengatur properti userInteractionEnabled serta menonaktifkan hal-hal di dalam sel.
Misalnya, saya punya formulir dalam tampilan tabel yang dikelompokkan. Salah satu sel mengarah ke tableView lain yang bertindak sebagai pemilih. Setiap kali kontrol diubah dalam tampilan utama saya memanggil metode ini
-(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 Jawab:
Berikut ini adalah implementasi Swift 4 untuk membatalkan 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
}
Cara lain adalah mengganti metode tableView dengan willSelectRowAt dan mengembalikan nil jika Anda tidak ingin menampilkan segue.
showDetails()
- Adalah beberapa bool. Dalam kebanyakan kasus harus diimplementasikan dalam model data yang diwakili dalam sel dengan indexPath
.
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if showDetails() {
return indexPath
}
return nil
}