applescript - 日期选择器显示问题(主线程问题?)

标签 applescript applescript-objc nsalert nsdatepicker

使用 https://github.com/bat-tomr/dialog-node 中的 AppleScript 文件...

# 06/04/16 09:35:02
# Author: Shane Stanley
# Adapted by Christopher Stone

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

my datePicker()

on datePicker()
    set theApp to path to frontmost application as text

    if not (current application's NSThread's isMainThread()) as boolean then
        display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
        error number -128
    end if
    -- create a view
    set theView to current application's NSView's alloc()'s initWithFrame:(current application's NSMakeRect(0, 0, 100, 175))
    -- create date picker
    set datePicker to current application's NSDatePicker's alloc()'s initWithFrame:(current application's NSMakeRect(0, 0, 100, 100))
    -- set style: choices are NSTextFieldAndStepperDatePickerStyle, NSClockAndCalendarDatePickerStyle, or NSTextFieldDatePickerStyle
    #datePicker's setDatePickerStyle:(current application's NSClockAndCalendarDatePickerStyle)
    datePicker's setDatePickerStyle:(current application's NSTextFieldAndStepperDatePickerStyle)
    #datePicker's setDatePickerStyle:(current application's NSTextFieldDatePickerStyle)
    -- set elements: choices include NSHourMinuteDatePickerElementFlag, NSHourMinuteSecondDatePickerElementFlag, NSTimeZoneDatePickerElementFlag, NSYearMonthDatePickerElementFlag, and NSEraDatePickerElementFlag
    datePicker's setDatePickerElements:((current application's NSYearMonthDayDatePickerElementFlag) + (current application's NSHourMinuteSecondDatePickerElementFlag as integer))

    -- set initial date
    #datePicker's setDateValue:(current application's NSDate's |date|())
    --set theCal var to a new(empty) instance of the calendar
    set theCal to current application's class "NSCalendar"'s currentCalendar()
    -- unpack the components of theCal to a variable
    set theComponents to theCal's components:254 fromDate:(current application's NSDate's |date|())
    theComponents's setSecond:0
    theComponents's setMinute:0
    theComponents's setHour:12
    theComponents's setYear:2015
    theComponents's setMonth:4
    theComponents's setDay:1
    datePicker's setDateValue:(theCal's dateFromComponents:theComponents)

    -- get the size it needs
    set theSize to datePicker's fittingSize()
    --resize the picker and view accordingly
    theView's setFrameSize:theSize
    datePicker's setFrameSize:theSize
    -- add the picker to the view
    theView's setSubviews:{datePicker}
    -- create an alert
    set theAlert to current application's NSAlert's alloc()'s init()
    -- set up alert
    tell theAlert
        its setMessageText:"Pick a date and time"
        its setInformativeText:"Any date"
        its addButtonWithTitle:"OK"
        its addButtonWithTitle:"Cancel"
        its setAccessoryView:theView
    end tell

    -- show alert in modal loop
    set returnCode to theAlert's runModal()
    if returnCode = (current application's NSAlertSecondButtonReturn) then error number -128
    -- retrieve date
    #set theDate to datePicker's dateValue() as date
    # Shane Stanley
    # http://macscripter.net/viewtopic.php?pid=119633#p119633
    set theDate to datePicker's dateValue()
    #set theCal to current application's class "NSCalendar"'s currentCalendar()
    -- unpack the components of theDate to a variable
    set theComponents to theCal's components:254 fromDate:theDate
    set theDate to current date
    set day of theDate to 1 -- important
    set seconds of theDate to theComponents's |second|()
    set year of theDate to theComponents's |year|()
    set month of theDate to theComponents's |month|()
    set day of theDate to theComponents's |day|()
    set hours of theDate to theComponents's hour()
    set minutes of theDate to theComponents's minute()

    return (theDate as text)
    #return (theDate)
end datePicker

日期选择器不显示(至少在 Mojave 上)。但是,如果我在 runModal 之前放置 显示警报(但不是其他情况),它确实会显示。

我知道这可能与后面的 Mac OSX 版本中需要 performSelectorOnMainThread 有关,但如果是这种情况,我无法添加它以使代码可以工作。有什么想法吗?

最佳答案

给你...没什么好说的。我基本上只是重写了它,因为我无法忍受凌乱的代码:

# 06/04/16 09:35:02
# Author: Shane Stanley
# Adapted by Christopher Stone
# Fixed & Rewritten by CJK
--------------------------------------------------------------------------------
use framework "AppKit"
use scripting additions

property this : a reference to the current application
property nil : a reference to missing value
property _1 : a reference to reference

property NSAlert : a reference to NSAlert of this
property NSDatePicker : a reference to NSDatePicker of this
property NSView : a reference to NSView of this

property NSAlertSecondButtonReturn : 1001
property NSHourMinuteSecondDatePickerElementFlag : 14
property NSTextFieldAndStepperDatePickerStyle : 0
property NSYearMonthDayDatePickerElementFlag : 224
--------------------------------------------------------------------------------
property date : missing value
--------------------------------------------------------------------------------
on run
    its performSelectorOnMainThread:("showDatePicker:") withObject:{¬
        NSTextFieldAndStepperDatePickerStyle, ¬
        NSYearMonthDayDatePickerElementFlag + ¬
        NSHourMinuteSecondDatePickerElementFlag} ¬
        waitUntilDone:true

    return my date
end run

on showDatePicker:params
    local params

    set {PickerStyle, PickerElements} to params

    tell (current date) to set ¬
        [dateFrom, day, its month, day, year, time] to ¬
        [it, 1, 4, 1, 2015, 12 * hours + 0 * minutes]

    tell NSDatePicker's alloc()
        initWithFrame_({{0, 0}, {100, 100}})
        setDatePickerStyle_(PickerStyle)
        setDatePickerElements_(PickerElements)
        setDateValue_(dateFrom)
        set fittingSize to fittingSize()
        setFrameSize_(fittingSize)

        set View to NSView's alloc()
        View's initWithFrame:{{0, 0}, {100, 175}}
        View's setFrameSize:fittingSize
        View's addSubview:it

        tell NSAlert's alloc()
            init()
            setMessageText_("Pick a date and time")
            setInformativeText_("Any date")
            addButtonWithTitle_("OK")
            addButtonWithTitle_("Cancel")
            setAccessoryView_(View)

            runModal()
        end tell

        set my date to dateValue() as date
    end tell
end showDatePicker:
---------------------------------------------------------------------------❮END❯

系统信息: AppleScript 版本: 2.7 系统版本: 10.13.6

关于applescript - 日期选择器显示问题(主线程问题?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56216434/

相关文章:

swift - NSAlert - 添加的按钮未按正确的顺序出现

cocoa - 使用 ScriptingBridge 框架与 Entourage 进行通信

macos - 如何检测用户是否在 OS X 中离开?

cocoa - 将窗口作为参数传递给 applescript 中的函数

objective-c - Cocoa/Objective-C 获取一个 HFS 路径(路径 :to:desktop) from a posix path (path/to/desktop)

objective-c - 与代表一起打开警报框 (NASlert) 并阻止所有其他窗口?

objective-c - Osascript - 无输出

macos - 使用Applescript在iTunes中获取流式轨道的歌曲名称

objective-c - 像从 cmd+tab 一样获取 ProcessList

cocoa - 没有ARC,应用程序不会在不释放手动创建的对象的情况下崩溃