2016-04-06 11 views
1

Попытка получить возможность печати для OS X. Кажется, требуется создание сеанса, затем формат страницы, проверка формата и т. Д. Кодекс компилируется, но получает статус -50 от PMCreateSession. Я объявляю printSession ненадлежащим образом? Как правило, не нужно иметь дело с UnsafeMutablePointers.PMCreateSession не создает сеанс печати

Спасибо!

let printSession: UnsafeMutablePointer<PMPrintSession> = nil 
    let pmPageFormat: UnsafeMutablePointer<PMPageFormat> = nil 
    var status = PMCreateSession(printSession) 
    status = PMCreatePageFormat(pmPageFormat) 
    status = PMSessionDefaultPageFormat(printSession.memory, pmPageFormat.memory) 
    let changed: UnsafeMutablePointer<DarwinBoolean> = nil 
    status = PMSessionValidatePageFormat(printSession.memory, pmPageFormat.memory, changed) 
    changed.destroy() 
    var pRect = PMRect() 
    status = PMGetAdjustedPageRect(pmPageFormat.memory, &pRect) 

    Swift.print("pRect \(pRect)") 

    status = PMRelease(pmPageFormat) 
    status = PMRelease(printSession) 
+0

Работает лучше при назначении указателей. Например, пусть printSession = UnsafeMutablePointer .alloc (1) Когда printSession, pmPageFormat и изменено объявляются и распределяются таким образом, фактически получают разумный rect (0, 0, 734, 576). Но все равно сбой в вызове PMRelease и неопределенность. – JKaz

+0

На данный момент заменен PMRelease (printSession) (и другой PMRelease) с помощью printSession.destroy() и printSession.dealloc (1). Нет очевидных вредных эффектов, но неясно, правильно ли это сделать или почему PMRelease падает. – JKaz

ответ

0

Могу ли я объявить printSession неправильно?

Можно приобрести PMPrintSession следующим образом:

// create a C Null pointer of type PMPrintSession 
let printSession = unsafeBitCast(0, to: PMPrintSession.self) 
// pass by & converts PMPrintSession to UnsafeMutablePointer<PMPrintSession> 
PMCreateSession(&printSession) 
… 
// recast printSession to release memory 
PMRelease(PMObject(printSession)) 

В качестве альтернативы, PMPrintSession можно получить из какао NSPrintInfo:

let printInfo = NSPrintInfo.shared() 
let printSession = PMPrintSession(printInfo.pmPrintSession()) 

Обычно не приходится иметь дело так много с UnsafeMutablePointers

Для получения информации больше информации об использовании UnsafeMutablePointer см StackOverflow "How to use UnsafeMutablePointer in Swift?"

Полный пример использования сердечника печати с Swift см 004.42Apple_CorePrintingExample на GitHub.

+0

Спасибо за ответ. Я вернусь к этому коду по мере того, как позволяет время (год назад похоже на всю жизнь!), И попробуйте проверить предложения и принять, если я это сделаю, или если вы увидите другие комментарии, что это правильный подход. Не игнорируя это или не решаясь принять; как раз в крайние сроки с другими вещами на данный момент. Спасибо. – JKaz