ios - perform - ¿Prevenir segue en el método prepareForSegue?
perform segue swift 4 (10)
Alternativamente, es un poco mal comportamiento ofrecer un botón que un usuario no debe presionar. Puede dejar el segmento conectado como soporte, pero comience con el botón deshabilitado. Luego conecte la "ediciónCambiado" de UITextField a un evento en el control de vista ala
- (IBAction)nameChanged:(id)sender {
UITextField *text = (UITextField*)sender;
[nextButton setEnabled:(text.text.length != 0)];
}
¿Es posible cancelar un segmento en el método prepareForSegue:
:?
Quiero realizar una comprobación antes del segmento, y si la condición no es verdadera (en este caso, si algún campo de UITextField
está vacío), muestre un mensaje de error en lugar de realizar el segmento.
Debe realizar Segue para iniciar sesión Registrarse
-(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);
}
Es fácil en el veloz.
override func shouldPerformSegueWithIdentifier(identifier: String,sender: AnyObject?) -> Bool {
return true
}
Es posible en iOS 6 y versiones posteriores: hay que implementar el método.
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
En su controlador de vista. Usted hace su validación allí, y si está bien, return YES;
si no es así, return NO;
y el prepareForSegue no se llama.
Tenga en cuenta que a este método no se le llama automáticamente cuando se activan los segmentos mediante programación. Si necesita realizar la comprobación, debe llamar a shouldPerformSegueWithIdentifier para determinar si se debe realizar segue.
La otra forma es anular el método de tableView con willSelectRowAt y devolver nil si no desea mostrar el segmento. showDetails()
- es un bool. En la mayoría de los casos, se debe implementar en el modelo de datos que se representa en celda con indexPath
.
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if showDetails() {
return indexPath
}
return nil
}
Similar a la respuesta de Kaolin es dejar la secuencia conectada al control pero validar el control según las condiciones de la vista. Si está activando la interacción de la celda de la tabla, también debe establecer la propiedad userInteractionEnabled y desactivar las cosas en la celda.
Por ejemplo, tengo un formulario en una vista de tabla agrupada. Una de las celdas conduce a otra tableView que actúa como un selector. Siempre que se cambia un control en la vista principal, llamo a este método.
-(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 Respuesta:
La siguiente es la implementación de Swift 4 para cancelar 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
}
Nota: la respuesta aceptada es el mejor enfoque si puede apuntar a iOS 6. Para apuntar a iOS 5, esta respuesta servirá.
No creo que sea posible cancelar un prepareForSegue
en prepareForSegue
. Yo sugeriría mover su lógica hasta el punto en que se performSegue
primero el mensaje performSegue
.
Si está utilizando Interface Builder para conectar un segmento directamente a un control (por ejemplo, vincular un segmento directamente a un UIButton
), puede lograr esto con un poco de refactorización. Conecte el segmento al controlador de vista en lugar de a un control específico (elimine el enlace de segmento anterior y luego presione la tecla Control y arrastre desde el controlador de vista al controlador de vista de destino). Luego cree una IBAction
en su controlador de vista y conecte el control a la IBAction. Luego, puede hacer su lógica (verifique el campo de texto vacío) en la IBAction que acaba de crear, y decida si desea performSegueWithIdentifier
o no el programaSegueWithIdentifier performSegueWithIdentifier
programación.
Swift 3 : func shouldPerformSegue (withIdentifier identifier: String, sender: Any?) -> Bool
Devuelva el valor verdadero si se debe realizar el segue o falso si se debe ignorar.
Ejemplo :
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
}
Como dijo Abraham, marque válido o no en la siguiente función.
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender
{
// Check this identifier is OK or NOT.
}
Y, el performSegueWithIdentifier:sender:
llamado por programación se puede bloquear sobrescribiendo el siguiente método. De forma predeterminada, no está comprobando la validez o no por -shouldPerformSegueWithIdentifier:sender:
podemos hacerlo manualmente.
- (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];
}