Как определить фактическое оборудование TouchBar, доступное в книге Mac, с помощью obj c?

Как определить фактическое оборудование сенсорной панели, доступно в книге Mac с использованием кода объекта, чтобы я мог предоставить параметры меню сенсорной панели.


person Jeba Moses    schedule 13.02.2017    source источник


Ответы (3)


Из документации Apple:

Вашему приложению не нужно и не нужен API, чтобы знать, доступна ли сенсорная панель. Независимо от того, запущено ли ваше приложение на компьютере с поддержкой сенсорной панели или нет, экранный пользовательский интерфейс (UI) вашего приложения отображается и ведет себя одинаково.

Чтобы проверить, доступна ли сенсорная панель (например, для улучшения UI/UX), вы должны реализовать делегата и установить Bool, например:

// Declare a class variable
@property (nonatomic, assign) BOOL isTouchBarAvailable;

@available(OSX 10.12.1, *)
// A bellow version can not be installed on a new MacBook. 
// Like an iPhone 7 can't have iOS9 installed.
- (NSTouchBar *)makeTouchBar
{
    // ... here the code to make the bar
    self.isTouchBarAvailable = YES
    return touchBar
}

Источник: https://developer.apple.com/reference/appkit/nstouchbar?language=objc

person Ludovic    schedule 13.02.2017
comment
спасибо за ваш добрый ответ, не могли бы вы сказать мне, как получить доступ к доступным входам/выходам для Mac. чтобы я мог узнать, доступен ли TouchBar или нет из списка оборудования. - person Jeba Moses; 13.02.2017
comment
я обновляю свой ответ - person Ludovic; 13.02.2017
comment
Пожалуйста, рассмотрите этот случай: предположим, что если старый пользователь Mac обновил свою ОС, но не имеет TouchBar (аппаратного обеспечения), как мы можем определить. (Bcz мне нужно указать некоторые параметры, связанные с сенсорной панелью, в настройках.) - person Jeba Moses; 13.02.2017
comment
@JebaMoses это невозможно! Apple выпускает новый MacBook Pro с версией 10.12.1. Следующая версия не может быть установлена ​​на новый MacBook. Например, на iPhone 7 не может быть установлена ​​iOS9. - person Ludovic; 13.02.2017
comment
@Ludovic: Просто к вашему сведению: я думаю, что они могли изменить спецификации доступности на 10.12.2, хотя я не могу подтвердить. Я всегда получаю @available(OSX 10.12.2, *) при попытке реализовать любой код сенсорной панели... - person l'L'l; 13.02.2017
comment
Первоначальный вопрос задается для Objective-C... Я понятия не имею, почему до сих пор все ответы были Swift. - person Michael Dautermann; 13.02.2017
comment
@MichaelDautermann: Что касается кода; Я не вижу ничего доступного от Apple, что показывает разницу между Swift и Objective-C; поищите сами: developer.apple.com/reference/appkit/nstouchbar?language= objc... (Objective-C теперь, по-видимому, Swift) :D, и да, это был сарказм. - person l'L'l; 13.02.2017
comment
API выглядят одинаково (и это благодаря целенаправленному дизайну Swift), но эти два языка разные. Посмотрите на ответ Людовика до и после его редактирования со Swift на Objective-C. Вы не сможете скомпилировать эту функцию Swift в файле .m, а также не сможете скомпилировать Objective-C в файле .swift (вам нужно будет использовать соединительный заголовок, чтобы получить доступ из Swift в Obj-C) . - person Michael Dautermann; 13.02.2017
comment
@MichaelDautermann: Очевидно, но почему, черт возьми, Apple не показывает код Objective-C, когда вы щелкаете между Swift и Objective-C на этой странице — это просто лень! - person l'L'l; 13.02.2017
comment
Разработчики годами жалуются на половинчатую и неполную документацию Apple, и, честно говоря, , я полагаю, что большая часть документации Apple создается автоматически из файлов интерфейса (.h) с использованием инструментов/процессов, подобных тем, которые можно найти описано в этом сообщении блога. Может быть, инженер Apple просто забыл поставить скобки или метки в нужных местах в файле .h? - person Michael Dautermann; 13.02.2017

NSTouchBar может работать как в программном, так и в аппаратном обеспечении, как показывает симулятор в Xcode. Для работы не требуется аппаратное обеспечение. Однако в примечаниях к выпуску Xcode 8 рассказывается, как проверить, может ли ОС поддерживать какие-либо функции сенсорной панели.

https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html

Xcode 8.1 поддерживает сенсорную панель для компьютеров Mac, которые ее содержат, и поддерживает добавление функциональных возможностей сенсорной панели в ваше приложение. (28859277) Прежде чем использовать функции Touch Bar в своем приложении, убедитесь, что приложение работает в версии macOS, включающей поддержку Touch Bar, с помощью проверки во время выполнения.

Например, следующий код Objective-C выполняет проверку во время выполнения, чтобы убедиться, что NSTouchBar доступен:

NSClassFromString(@"NSTouchBar") != ноль

В коде Swift выполните проверку доступности для macOS 10.12.1 и проверку доступности класса Touch Bar во время выполнения. Например:

NSClassFromString("NSTouchBar") != ноль

person AndyTang    schedule 22.02.2017

Если вам нужен какой-то контроль, вы можете использовать isAutomaticCustomizeTouchBarMenuItemEnabled:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {

         // Here we just opt-in for allowing our instance of the
         // NSTouchBar class to be customized throughout the app.
        if #available(OSX 10.12.2, *) {
            NSApplication.shared().isAutomaticCustomizeTouchBarMenuItemEnabled = true
        }
    }
    /*
    Whether or not a menu item to customize the touch bar can be automatically 
    added to the main menu. It will only actually be added when hardware 
    or simulator is present. Defaults to NO. Setting this property to YES 
    is the recommended way to add the customization menu item.
    */
person l'L'l    schedule 13.02.2017
comment
@I'L'I, мы можем определить поддержку API, используя версию OSX, предположим, что старый пользователь Mac обновил свою ОС, но не имеет TouchBar (аппаратное обеспечение), как мы можем определить. - person Jeba Moses; 13.02.2017
comment
@JebaMoses: я не знаю конкретного способа, я полагаю, вы могли бы вернуть, удалось ли успешно вернуть сенсорную панель. В противном случае, согласно документам, на самом деле нет API, с которым можно было бы иметь дело, поскольку сенсорная панель более или менее доступна независимо от того, есть ли в системе аппаратное обеспечение для ее поддержки. Вот один из способов проверки возвращаемого значения... (Swift). Если ничего не возвращается, вы можете предположить, что сенсорной панели нет. - person l'L'l; 13.02.2017
comment
По сути, в Obj-C вы можете сделать что-то эквивалентное if (NSTouchBar() == nil)... честно говоря, я понятия не имею, сработает это или нет. Мне ничего не возвращается, но у меня нет сенсорной панели, чтобы проверить это :) - person l'L'l; 13.02.2017