Показать UIAlertView или UIViewController в настройке логотипа

Я создаю настройку для отправки SMS в приложении MobileSMS по умолчанию, которое поставляется с iOS 6.1. Несмотря на то, что мне удалось подключиться к кнопке «Отправить», я не могу создать всплывающее окно для информирования пользователя ни с помощью UIAlertView, ни с помощью UIViewController. Я думаю, проблема в том, что класс CTMmsEncoder, к которому я подключаюсь, не имеет контроллера представления, который можно было бы каким-то образом переопределить.

Мой вопрос в том, есть ли способ заставить представление появиться в такой ситуации. Я просмотрел множество исходных кодов для твиков, но не могу найти похожий случай. Я даже пытался создать dylib и загрузить оттуда UIViewController, но получил (ожидаемую) ошибку:

Oct 25 14:37:59 Pudge SpringBoard[950] <Warning>: Warning: Attempt to present <ModalViewController: 0x1dbbe1a0> on <KSMSDylibViewOne: 0x1db7da50> whose view is not in the window hierarchy!

При попытке реализовать класс с ViewController непосредственно в моем твике (скажем класс ModalViewController), то Theos явно выдает ошибку:

Tweak.xm:12:6: error: instance method 'presentViewController:animated:completion:' is being used on 'Class' which is not in the root class
      [-Werror,-Wobjc-method-access]
    [self presentViewController:view animated:YES completion:nil];
    ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Есть ли способ обойти это, или мне нужно переделывать?

Заранее спасибо,

Панайотис.


person Panagiotis    schedule 25.10.2013    source источник


Ответы (1)


Если вы просто хотите создать что-то вроде того, что вы получаете с UIAlertView, вы должны иметь возможность использовать CFUserNotificationCreate() даже в ситуации, когда у вас нет надлежащей иерархии представлений.

См. этот ответ KennyTM или другой Я написал здесь... перейдя к разделу Уведомлять пользователя от демона, пункт (2).

person Nate    schedule 26.10.2013
comment
Это, безусловно, очень хороший подход, но сможет ли он разрешить ввод данных пользователем? Если бы я хотел добавить пароль для ввода пользователем перед отправкой SMS, ваше предложение (2) только создало бы предупреждение или (1) открыло бы другое приложение (если я правильно понял), верно? - person Panagiotis; 26.10.2013
comment
@Panagiotis, если под пользовательским вводом вы имеете в виду добавление текстового поля или что-то в этом роде ... нет, не будет. Но UIAlertView, упомянутый в вашем вопросе, тоже нет. Правильно, мое предложение (2) в связанном ответе - это просто всплывающее предупреждение, а (1) - это способ полностью открыть приложение пользовательского интерфейса (в этом случае из фонового демона). Надеюсь, это прояснит ситуацию. - person Nate; 26.10.2013
comment
@Panagiotis, на самом деле, мне, возможно, придется исправиться. Точный код, который я показываю, не дает вам ничего, кроме кнопок, но если вы посмотрите в документах Apple здесь, кажется, вы также можете создавать текстовые поля в своем предупреждении. Это набор API-интерфейсов Mac OS X, поэтому, если у вас есть дополнительный вопрос о том, как настроить CFUserNotification, вы можете пометить его osx вместо iphone или ios. Те же API должны работать и на iOS, просто они частные. - person Nate; 26.10.2013
comment
Да, ты прав! Я предполагаю, что текстовое поле может быть добавлено - позже я буду беспокоиться о том, как его реализовать. Кажется, я не могу make использовать ваш код - я получаю error: '__bridge' casts have no effect when not using ARC [-Werror,-Warc-bridge-casts-disallowed-in-nonarc] [dict setObject: @"Alert!" forKey: (__bridge NSString*)kCFUserNotificationAlertHeaderKey];, поэтому мне каким-то образом нужно сказать Theos использовать ARC (?). - person Panagiotis; 26.10.2013
comment
@Panagiotis, да, код, который я опубликовал, был написан для ARC. Вы можете либо выяснить, как включить ARC в настройках сборки theos, либо просто изменить мой код, чтобы сделать это по-старому, без ARC. Я думаю, вы бы просто изменили (__bridge NSString*) на прямое приведение: (NSString*). - person Nate; 26.10.2013
comment
Эпично! Наконец всплывает оповещение!! Теперь нужно выяснить, как остановить отправку сообщения iOS до того, как пользователь введет свой пароль (на самом деле сделать его модальным)! Большое спасибо (еще раз) Ната! - person Panagiotis; 26.10.2013