Установите stati c делегат для UIApplication в iOS 13 (цель- c) - PullRequest
0 голосов
/ 06 февраля 2020

Я не очень хорошо знаю цель - c, и я пытаюсь определить делегата приложения для использования его в других классах.

после поиска и в соответствии с некоторыми примерами я обнаружил, что я необходимо создать свойство stati c для сохранения делегата в этом:

.h:
@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>
+(AppDelegate *)sharedAppDelegate;


.m:
static AppDelegate *appDelegate = nil;
+(AppDelegate *)sharedAppDelegate{
    static dispatch_once_t pred;
    static AppDelegate *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[super alloc] init];
    });
    return shared;
}

, а затем установить делегат для этого свойства stati c (sharedAppDelegate):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [[UIApplication sharedApplication] setDelegate:[AppDelegate sharedAppDelegate]];

я использовал этот код на ios 11 и 12 и работал, но в ios 13 (xcode 11.3.1), когда я устанавливаю приложение делегата, экран становится черным, а xcode показывает следующие ошибки:

Thread 1: signal SIGABRT


libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

В чем проблема ?

наконец-то я хочу открыть всплывающую страницу ios, чтобы поделиться текстом с другими приложениями, такими как telegram или whatsapp или ... мне нужен этот делегат, чтобы использовать его в других классах, которые я вызываю функциями общего доступа:

void IOS::shareText(const QString &text) {

NSMutableArray *sharingItems = [NSMutableArray new];

    if (!text.isEmpty()) {
        [sharingItems addObject:text.toNSString()];
    }

    // get the main window rootViewController
    UIViewController *self = [[UIApplication sharedApplication].keyWindow rootViewController];

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil];
    if ( [activityController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8
          activityController.popoverPresentationController.sourceView = self.view;
    }
    [self presentViewController:activityController animated:YES completion:nil];

}

я использую смешанную цель - c с c ++ в qt

1 Ответ

0 голосов
/ 06 февраля 2020

Вам не нужно звонить [[UIApplication sharedApplication] setDelegate:[AppDelegate sharedAppDelegate]];. Делегат устанавливается в основной функции, автоматически генерируемой Xcode:

#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

Вам просто нужно добавить свойство только для чтения в свой AppDelegate:

@implementation AppDelegate

+ (AppDelegate *)sharedInstance
{
    return (AppDelegate *)UIApplication.sharedApplication.delegate;
}
...