Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:
function foo() {
var result;
$.ajax({
url: '...',
success: function(response) {
myCallback(response);
}
});
return result;
}
function myCallback(response) {
// Does something.
}
Мне удалось сделать это, используя следующий код:
CreditsViewController *creditspage = [self.storyboard instantiateViewControllerWithIdentifier:@"Credits"];
[UIView beginAnimations:@"flipping view" context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:YES];
[self.navigationController pushViewController:creditspage animated:NO];
[UIView commitAnimations];
Надеюсь, это поможет кому-то еще!
ответьте с помощью Swift3 -
для «push» segue:
class PushNoAnimationSegue: UIStoryboardSegue
{
override func perform()
{
source.navigationController?.pushViewController(destination, animated: false)
}
}
для «модального» сегмента:
class ModalNoAnimationSegue: UIStoryboardSegue
{
override func perform() {
self.source.present(destination, animated: false, completion: nil)
}
}
Я смог сделать это, создав пользовательский segue (на основе этой ссылки ).
PushNoAnimationSegue
(или как вы его назвали). import UIKit
/*
Move to the next screen without an animation.
*/
class PushNoAnimationSegue: UIStoryboardSegue {
override func perform() {
self.source.navigationController?.pushViewController(self.destination, animated: false)
}
}
PushNoAnimationSegue.h
#import <UIKit/UIKit.h>
/*
Move to the next screen without an animation.
*/
@interface PushNoAnimationSegue : UIStoryboardSegue
@end
PushNoAnimationSegue.m
#import "PushNoAnimationSegue.h"
@implementation PushNoAnimationSegue
- (void)perform {
[self.sourceViewController.navigationController pushViewController:self.destinationViewController animated:NO];
}
@end
Для тех, кто использует Xamarin iOS, ваш пользовательский класс segue должен выглядеть следующим образом:
[Register ("PushNoAnimationSegue")]
public class PushNoAnimationSegue : UIStoryboardSegue
{
public PushNoAnimationSegue(IntPtr handle) : base (handle)
{
}
public override void Perform ()
{
SourceViewController.NavigationController.PushViewController (DestinationViewController, false);
}
}
Не забывайте, что вам все равно нужно настроить пользовательский сеанс в своей доске объявлений и установить класс в PushNoAnimationSegue класс.
Для меня самый простой способ сделать это:
UIView.performWithoutAnimation {
self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil)
}
Доступен с iOS 7.0
Просто установите animated
false на UINavigationController.pushViewController
в Swift
self.navigationController!.pushViewController(viewController, animated: false)
Вот версия Swift, адаптированная для модального представления ViewController без анимации:
import UIKit
/// Present the next screen without an animation.
class ModalNoAnimationSegue: UIStoryboardSegue {
override func perform() {
self.sourceViewController.presentViewController(
self.destinationViewController as! UIViewController,
animated: false,
completion: nil)
}
}
PUSH БЕЗ АНИМАЦИИ: Swift Вот что сработало для меня.
import ObjectiveC
private var AssociatedObjectHandle: UInt8 = 0
extension UIViewController {
var isAnimationRequired:Bool {
get {
return (objc_getAssociatedObject(self, &AssociatedObjectHandle) as? Bool) ?? true
}
set {
objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
-------------------- SilencePushSegue --------------------
class SilencePushSegue: UIStoryboardSegue {
override func perform() {
if self.source.isAnimationRequired == false {
self.source.navigationController?.pushViewController(self.destination, animated: false)
}else{
self.source.navigationController?.pushViewController(self.destination, animated: true)
}
}
}
Использование: Установите класс segue из раскадровки, как показано на рисунке. установите для isAnimationRequired из вашего контроллера представления значение false, из которого вы хотите вызвать performSegue, когда вы хотите нажимать segue без анимации и возвращаться к true после вызова self.performSegue. Удачи ....
DispatchQueue.main.async {
self.isAnimationRequired = false
self.performSegue(withIdentifier: "showAllOrders", sender: self);
self.isAnimationRequired = true
}
Я использую Visual Studio w / Xamarin, и разработчик не предоставляет галочку «Анимация» в ответе dtochetto.
Обратите внимание, что разработчик XCode применит следующий атрибут к элементу segue в файле .storyboard: animates = "NO"
Я вручную отредактировал файл .storyboard и добавил animates = "NO" к элементу segue, и он работал для меня.
Пример:
<segue id="1234" destination="ZB0-vP-ctU" kind="modal" modalTransitionStyle="crossDissolve" animates="NO" identifier="screen1ToScreen2"/>
Ответ Яна отлично работает!
Вот быстрая версия Segue, если кому-то нужно:
PushNoAnimationSegue.swift
import UIKit
/// Move to the next screen without an animation.
class PushNoAnimationSegue: UIStoryboardSegue {
override func perform() {
let source = sourceViewController as UIViewController
if let navigation = source.navigationController {
navigation.pushViewController(destinationViewController as UIViewController, animated: false)
}
}
}