Подменю за споделяне на NSSharingService

Как да добавя подменюто Споделяне в приложение за Mac? Пример е Safari > Файл > Споделяне. Потърсих примерен код на Apple SharingServices, но не включва работещ елемент от менюто.

въведете описание на изображението тук

В момента имам бутон, който показва инструмент за избор на налични услуги за споделяне при докосване:

NSMutableArray *shareItems = [NSMutableArray arrayWithObject:[self.noteSynopsisView string]];
NSSharingServicePicker *sharingServicePicker = [[NSSharingServicePicker alloc] initWithItems:shareItems];
sharingServicePicker.delegate = self;
[sharingServicePicker showRelativeToRect:[self.shareButton bounds] ofView:self.shareButton preferredEdge:NSMaxYEdge];

Също така дефинирах елемент от подменюто Споделяне под менюто Файл за моя MainWindow.xib.

Доколкото разбирам, списъкът на NSSharingService се генерира в движение. Така че наистина не мога да дефинирам предварително услугите за елемента от менюто, който създадох в Interface Builder.

Благодаря за вашата помощ.


person DenVog    schedule 11.09.2012    source източник


Отговори (3)


Вижте +sharingServicesForItems: на NSSharingService. В метод -validateMenuItem: можете да създадете подменю, като използвате -title и -image на NSSharingServices, които връща. Свържете всяка услуга с всеки елемент от менюто и насочете действието на всеки елемент от менюто към това:

- (IBAction)shareFromService:(id)sender {
  [[sender representedObject] performWithItems: arrayOfItemsToShare];
}

Наистина е много просто. Apple свърши добра работа по този въпрос.

person Mel    schedule 19.09.2012
comment
+1 Благодаря и от мен! Успях да направя това да се случи в метода willOpen: делегат на обекта NSMenu. - person regulus6633; 21.12.2012
comment
Вместо validateMenuItem, това вероятно трябва да се направи в делегата menuNeedsUpdate:. Благодаря за насоката. - person Peter N Lewis; 19.07.2017
comment
Също така отбелязвам, че това не включва записа Още, а не последните записи, които показва NSSharingServicePicker. - person Peter N Lewis; 19.07.2017

Смятам, че същността може да ви помогне лесно да създадете подменю с подходящи услуги. https://gist.github.com/eternalstorms/4132533

Това е категория NSSharingServicePicker.

person 6 1    schedule 06.03.2013

Swift версия:

extension NSSharingServicePicker {
    
    class func menu(forSharingItems items: [AnyHashable]) -> NSMenu? {
        
        let sharingServices = NSSharingService.sharingServices(forItems: items)
        
        if sharingServices.isEmpty {
            return nil
        }
        
        let menu = NSMenu()
        
        for service in sharingServices {
            
            let item = MenuItem(label: service.title, action: #selector(_openSharingService), target: self, userInfo: ["sharingItems": items])
            
            item.image = service.image
            item.representedObject = service
            item.target = self
            menu.addItem(item)
            
        }
        
        return menu
        
    }
    
    @objc class private func _openSharingService(sender: MenuItem) {
        
        guard let items = sender.userInfo["sharingItems"] as? [AnyHashable], let service = sender.representedObject as? NSSharingService else {
            return
        }
        
        service.perform(withItems: items)
        
    }
    
}

class MenuItem: NSMenuItem {
    
    var userInfo: [String : Any] = [:]
    
    init(label: String, action: Selector?, target: AnyObject?, userInfo: [String : Any]) {
        self.userInfo = userInfo
        super.init(title: label, action: action, keyEquivalent: "")
    }
    
    required init(coder decoder: NSCoder) {
        super.init(coder: decoder)
    }
    
}
person Pawel    schedule 01.04.2021