Of course, it would be nice where you added that new line of code which solved the issue, in the context of your original code.
Post
Replies
Boosts
Views
Activity
Will Apple fix this quickly? It has seriously broken my app, which I just put on the App Store. It worked just fine before upgrading to iPadOS 16.1. Is there any good workaround, or can we expect it to be fixed quickly by Apple?
On Sept. 11, 2022, I started getting the same kind of error messages.
I had recently made changes on constraints for a PDFView, the source for my screen shots. In my case, I had these constraints in the ViewDidLoad. I had deleted the constraints for TOP and BOTTOM. When I added them back the errors went away, and I was able to get perfect screen shots and save them to the Photos app.
I'm sure it was a "frame" issue created by bad or missing constraints.
Let me know how it goes.
--Jon
Excellent question. I'm working on the same thing. So far, I have been able to airdrop a record (to my M1 Mac from my M1 iPad Pro)successfully using this code:
func shareDicta() { //LOG1
let url = saveDicta("share")
print(url)
let activityVC = UIActivityViewController(activityItems:[url],applicationActivities:nil)
activityVC.title = "Share One"
activityVC.excludedActivityTypes = []
activityVC.popoverPresentationController?.sourceView = self.view
activityVC.popoverPresentationController?.sourceRect = CGRect(x:self.view.bounds.midX,y:self.view.bounds.midY,width:0,height:0)
self.present(activityVC, animated: true, completion: nil)
}
//=============
func saveDicta(_ fName: String) -> URL {
var dictaFName = ""
if(fName.count<1){return URL(string:"")!}
dictaFName = fName
let fetchRequest: NSFetchRequest = DictaData.fetchRequest()
fetchRequest.predicate = NSPredicate(format:"%K == %@","dictaUUID",svUUID as CVarArg as CVarArg)
fetchRequest.fetchLimit = 1
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return URL(string:"")!}
let context = appDelegate.persistentContainer.viewContext
do{
let dicta = try context.fetch(fetchRequest).first
do {
let dictaURL = try FileManager.default.url(for:.documentDirectory,in:.userDomainMask,appropriateFor:nil,
create:false).appendingPathComponent(dictaFName + ".dicta")
let data = try NSKeyedArchiver.archivedData(withRootObject:dicta as Any,requiringSecureCoding:false)
try data.write(to:dictaURL)
return dictaURL
}catch{
print("ERROR: (error.localizedDescription)")
return URL(string:"")!
}
}
catch let error as NSError {
print("DictaData FETCH FAILED. (error), (error.userInfo)")
return URL(string:"")!
}
}
//==============
When I send it back to my app on my iPad, I am struggling to read it back in, not to mention adding to the CoreData storage. Here's what I have so far on that end:
@objc class func insertDicta(_ path: URL) { print("DictateVC:(#function)");
print(path)
if(fm.fileExists(atPath:path.path)){
do{
let dData = try Data(contentsOf:path)
//let dicta = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dData) as! NSManagedObject
let dicta = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dData)
print(dData)
try fm.removeItem(at:path)
}catch let error as NSError{
print("Could not save. (error), (error.userInfo)")
//okAlert("Save Failed","")
return
}
}
}
I am able to read/load the record into 'dData' but on the next line, when I try 'NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dData)' the app crashes with this error:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DictaData initWithCoder:]: unrecognized selector sent to instance 0x280939500'
Here, DictData is the name of my CoreData entity. Anyway, I don't know if this helps at all, but I hope so. Can you let me know if you've discovered anything which works? I'm right in the middle of working on it, so any breakthroughs would be very helpful. BTW, the record my app sends to the Mac can be read with the TextEdit app, and looks like this:
bplist00‘
X$versionY$archiverT$topX$objects � ܆_ NSKeyedArchiver— TrootÄ Ø )*.4DEKLRZ[_cdefgknopU$nullfi
!"#$%&'(YdictaFnSzYdictaMlhfSurlUtitleYdictaFColYdictaIndxYdictaDateYdictaLocaYcanonTextYdictaLangV$classZdictaMonthYdictaUUIDYdictaFontÄ Ä Ä�Ä Ä Ä Ä Ä Ä Ä Ä Ä Ä Ä i0J0o0à0F0T0V0D00Y“+ ,-WNS.time#AƒDπzŸ¶ Ä “/012Z$classnameX$classesVNSDate¢13XNSObjectŸ56789: ;<=>??@AB>C_ UIColorComponentCountWUIGreenVUIBlueWUIAlphaUNSRGB_ UISystemColorNameUUIRed\NSColorSpace "����"?Ä��E0 0 1Ä Ä YblueColor”/0FGHI[$classhintsWUIColor¢G3°JWNSColor"B≤‚ ”M NOPQ_ UIFontDescriptorOptions_ UIFontDescriptorAttributes �Ä Ä
”ST UWYWNS.keysZNS.objects°VÄ °XÄ Ä
_ NSFontFamilyAttribute_ American Typewriter“/0]^\NSDictionary¢]3“/0`a_ UIFontDescriptor¢b3_ UIFontDescriptor
_ Japanese Uja-JA"=LÃÕ“h ij\NS.uuidbytesO Ô√˚ ∏C∏Öπt<&ŇRÄ “/0lmVNSUUID¢l3i0J0o0à0F0T0V0D00YW2022007“/0qrYDictaData£qs3_ NSManagedObject� � � �$�)�2�7�I�L�Q�S�n�t�ë�õ�•�©�Ø�π�√�Õ�◊�·�Î�Ú�˝ ! # % ' ) + - @ E M V X ] h q x { Ñ ó Ø ∑ æ ∆ à ‡ Ê Û ı ˙ ˇ ( 0 3 5 = B I c Ä Ç Ñ Ü ç ï † ¢ § ¶ ® ™ ¬ ÿ › Í Ì Ú 6 < A F S f h m t w ä í ó ° •������ �������t�������������� ∑
From my perspective, there is useful data there, so that if I could just load that data, as, I might be able to access this information, parse it, if you will, then reconstruct it into a format which could then be inserted into CoreData. Something like this:
@objc func saveDicta() { //print("(#function)")
if(edDict){saveEdit();return}
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}
let managedContext = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName:"DictaData",in:managedContext)!
let dicta = NSManagedObject(entity:entity,insertInto:managedContext)
dicta.setValue(self.textView.text,forKeyPath:"title")
dicta.setValue(local, forKeyPath:"dictaLoca")
dicta.setValue(langu, forKeyPath:"dictaLang")
dicta.setValue(index, forKeyPath:"dictaIndx")
dicta.setValue(fgcol, forKeyPath:"dictaFCol")
dicta.setValue(descr, forKeyPath:"dictaFont")
dicta.setValue(fntSz, forKeyPath:"dictaFnSz")
dicta.setValue(mlhfa, forKeyPath:"dictaMlhf")
dicta.setValue(UUID(), forKeyPath:"dictaUUID")
dicta.setValue(NSDate(), forKeyPath:"dictaDate")
do {
try managedContext.save()
dictas.append(dicta)
} catch let error as NSError {
print("Could not save. (error), (error.userInfo)")
okAlert("Save Failed","")
return
}
}
Good luck. Please let me know of any breakthroughs.
--Jon
I use cmdKey to create custom keyboard and menu shortcuts. I wanted to use the escape key to switch between two screens, but this disabled the default behavior for the escape key on the Mac (exiting fullscreen mode). Detecting fullscreen mode would offer a chance to temporally disable the custom shortcut, restoring default behavior (escaping from fullscreen mode with the escape key). My workaround so far is to compare the updated size.height to mainScreen.nativeBounds.height within viewWillTransitionToSize(). If size.height >= nativeBounds.height, then I assume we're in fullscreen mode. I set a boolean isFullScreen, which disables the custom shortcut within the validateCommand() method.
I've got a workaround. Going fullscreen triggers viewWillTransitionToSize. I get the new size.height and compare it to mainScreen.nativeBounds.height. If the new size.height >= nativeBounds.height, then I assume the app has gone fullscreen. An isFullScreen boolean is set here, and when the escape key is pressed, the shortcut is temporarily disabled, allowing default behavior for the escape key.
I use cmdKey to create keyboard and menu shortcuts. The idea was to use the escape key to toggle between two windows. Of course, assigning the escape key to a custom shortcut interferes with its default behavior of "escaping" out of full screen mode. I wanted to avoid disturbing this default behavior. Detecting fullscreen mode, offers the chance to temporarily disable the custom shortcut, restoring the default behavior of the escape key.