Ваш массив слишком велик, чтобы вписаться в стек, подумайте об использовании кучи:
int *sieve = malloc(2000000 * sizeof(*sieve));
Если вы действительно хотите изменить размер стека, взгляните на этот документ.
Совет : - Не забудьте освободить динамически выделенную память, если она больше не нужна.
Вы можете добавить это к классу по своему вкусу:
+ (MBProgressHUD *)showGlobalProgressHUDWithTitle:(NSString *)title {
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES];
hud.labelText = title;
return hud;
}
+ (void)dismissGlobalHUD {
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
[MBProgressHUD hideHUDForView:window animated:YES];
}
Это может быть вызвано для любого класса. Вам не нужно сохранять строгую ссылку на HUD при использовании этих методов удобства класса.
В зависимости от вашей конкретной ситуации, вы, вероятно, также захотите обрабатывать случаи, когда новый hud запрашивается до того, как другой будет скрыт. Вы можете скрыть предыдущий hud, когда появляется новый или появляется какая-то очередь и т. Д.
Скрытие предыдущего экземпляра HUD перед показом нового довольно просто.
+ (MBProgressHUD *)showGlobalProgressHUDWithTitle:(NSString *)title {
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
[MBProgressHUD hideAllHUDsForView:window animated:YES];
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES];
hud.labelText = title;
return hud;
}
Этот ответ - то, что я сейчас использую для 5-6 приложений, потому что он прекрасно работает и внутри блоков. Однако я нашел проблему с этим. Я могу сделать это показанным, но не могу заставить его исчезнуть, если также присутствует UIAlertView. Если вы посмотрите на реализацию, вы увидите, почему. Просто измените его следующим образом:
static UIWindow *window;
+ (MBProgressHUD *)showGlobalProgressHUDWithTitle:(NSString *)title {
window = [[[UIApplication sharedApplication] windows] lastObject];
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES];
hud.labelText = title;
return hud;
}
+ (void)dismissGlobalHUD {
[MBProgressHUD hideHUDForView:window animated:YES];
}
Это обеспечит удаление HUD из тех же окон, в которых он был показан.
Я использовал код от @Michael Shang и имел все виды противоречивого поведения при отображении HUD. Оказывается, использование последнего окна ненадежно, так как клавиатура iOS может просто его скрыть. Так что в большинстве случаев вы должны получить окно, используя AppDelegate, как упомянуто @David Lawson.
Вот как в Swift:
let window = UIApplication.sharedApplication().delegate!.window!!
let hud = MBProgressHUD.showHUDAddedTo(window, animated: true)
Однако, с учетом вышеизложенного ваш HUD будет отображаться за клавиатурой iOS (если они перекрываются). Если вам нужен HUD для наложения клавиатуры, используйте последний метод окна.
В моем случае я показываю HUD, затем вызываю resignFirstResponder()
, немедленно скрывая окно, в которое был добавлен HUD. Так что это то, о чем нужно знать, единственное окно, которое гарантированно остается рядом, - это первое.
Я закончил тем, что создал метод, который при необходимости мог бы добавить HUD над клавиатурой:
func createHUD(size: CGSize, overKeyboard: Bool = false) -> MBProgressHUD {
let window = overKeyboard ? UIApplication.sharedApplication().windows.last!
: UIApplication.sharedApplication().delegate!.window!!
let hud = MBProgressHUD.showHUDAddedTo(window, animated: true)
hud.minSize = size
hud.bezelView.style = .SolidColor
hud.bezelView.color = UIColor(white: 0, alpha: 0.8)
return hud
}
Чтобы показать один MBProgressHUD
одновременно, вы можете проверить, добавлен ли HUD в том же виде или нет. Если нет, то добавьте HUD, иначе не добавляйте новый HUD.
-(void)showLoader{
dispatch_async(dispatch_get_main_queue(), ^{
BOOL isHudAlreadyAdded = false;
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
NSEnumerator *subviewsEnum = [window.subviews reverseObjectEnumerator];
for (UIView *subview in subviewsEnum) {
if ([subview isKindOfClass:[MBProgressHUD class]]) {
isHudAlreadyAdded = true;
}
}
if(isHudAlreadyAdded == false){
[MBProgressHUD showHUDAddedTo:window animated:YES];
}
});
}
-(void)hideLoader{
dispatch_async(dispatch_get_main_queue(), ^{
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
[MBProgressHUD hideHUDForView:window animated:YES];
});
}
Примечание : Учитывая мнения, которые получает этот Вопрос, я решил опубликовать способ, который я выбрал в качестве решения. Это НЕ ответ на мой вопрос. (Следовательно, принятый ответ остается принятым)
В то время я использовал SVProgressHUD , поскольку его было очень просто интегрировать и использовать.
Все, что вам нужно сделать, это просто перетащить папку SVProgressHUD / SVProgressHUD в ваш проект. (Вы также можете выбрать кокоаподы ИЛИ карфаген)
<час>В Objective-C:
[SVProgressHUD show]; // Show
[SVProgressHUD dismiss]; // Dismiss
<час> В Swift:
SVProgressHUD.show() // Show
SVProgressHUD.dismiss() // Dismiss
Кроме того, Показать и скрыть HUD необходимо выполнить в главном потоке . (В частности, вам нужно это, чтобы скрыть HUD в некотором закрытии в фоновом режиме)
Например:
dispatch_async(dispatch_get_main_queue(), ^{
[SVProgressHUD dismiss]; // OR SHOW, whatever the need is.
});
Существуют дополнительные методы для отображения пользовательских сообщений с HUD, показывая успех / неудачу на короткое время и автоматическое увольнение.
MBProgressHUD по-прежнему остается хорошим выбором для разработчиков. Просто я нашел SVProgressHUD для своих нужд.