Post

Replies

Boosts

Views

Activity

Reply to App rejected due to Guideline 3.1.2 - Business - Payments - Subscriptions
My desktop application was also rejected because it has a subscription in-app purchase several months ago. So I was forced to switch to a non-consumable in-app purchase. But I ran into many desktop applications (Adobe Lightroom, CorelDRAW, Polarr Photo Editor...) with such when I was browsing applications with Mac App Store app several days ago. So I would ask them why they are allowed if your app is rejected with a subscription in-app purchase.
Nov ’19
Reply to App rejected due to Guideline 3.1.2 - Business - Payments - Subscriptions
If you don't hear their reply, you may consider filing an appeal. But you have to be careful when you do so. The appeal board used to be quite neutral, but things changed two to three years ago. These days, the appeal board is likely to take the side of the reviewer with or without reading your grieviance. If they rule against you, even when the reviewer is absolutely wrong, it's final. Basically, it's now an unreliable process. Sometimes, the reviewer changes their decision when they realize they are wrong if you give them 2 to 3 days.
Nov ’19
Reply to NSMenuItem keyEquivalent under Status Menu
If what I have islet showHomeMenuItem = NSMenuItem(title: "Show Home", action:#selector(showHome), keyEquivalent: "h"), then what appears on my status menu is Command + H. If what I have islet showHomeMenuItem = NSMenuItem(title: "Show Home", action:#selector(showHome), keyEquivalent: "H"), then what appears on my status menu is Command + Shift + H. And I'll get beeped if I press Command + Shift + H.
Nov ’19
Reply to Updating NSView With SubViews and a Memory Leak
Claude,The following code shows sub view counts.class MainViewController: NSViewController { @IBOutlet weak var displayView: NSView! override func viewWillAppear() { super.viewWillAppear() print("No. of subviews before the display view shows up", displayView.subviews.count) // => 0 for sub in displayView.subviews { sub.removeFromSuperview() } } override func viewDidAppear() { super.viewDidAppear() for sub in displayView.subviews { sub.removeFromSuperview() } print("No. of subviews after the display view shows up", displayView.subviews.count) // => 0 } override func viewWillDisappear() { super.viewWillDisappear() print("No. of subviews right before the display view hides itself", displayView.subviews.count) // => 3 for sub in displayView.subviews { sub.removeFromSuperview() } } override func viewDidDisappear() { super.viewDidDisappear() print("No. of subviews after the display view hides itself", displayView.subviews.count) // => 0 } }Initially, the memory consumption stays around 100 MB. After I hide the window and bring it back five times or so, it will go up to around 480 MB.
Dec ’19
Reply to App Rejection: Guideline 4.2 - Design
I don't necessarily mean to critisize how Apple, Inc. runs App Store and Mac App Store. But dealing with their reviewers is like playing the Russian roulette. Most reviewers find no problem if I give users one week of free trial and then validate their in app purchase status. But one reviewer now says no. Some reviewers seem to accept the idea that a desktop application can have a subscription-based IAP. Mine was rejected several months ago. It's very difficult for me to figure out what is acceptable and what is not.
Dec ’19
Reply to Adding a Small Number to Each Button
Thank you, OOPer. The concern that I had with Text is that the string won't be necessarily placed inside the corresponding button. If I use your code, a small number will appear to the left of the corresponding button, not inside the corresponding button. I'm sorry if I failed to explain my needs initially.
Dec ’20
Reply to Adding a Small Number to Each Button
Interestingly, there is a function called overlay. Button("1") { 		 } .overlay(Text("4").font(.footnote).foregroundColor(.blue).offset(x: -16, y: -16)) .buttonStyle(BorderlessButtonStyle()) .frame(width: 48, height: 48, alignment: .center) .background( 		RoundedRectangle(cornerRadius: 2) 				.fill(Color.white) 				.shadow(color: Color.black.opacity(0.4), radius: 2, x: 0, y: 0) )
Dec ’20
Reply to Calling a Function to Set Up Body
Do I have to call it with onAppear like the following? import SwiftUI struct ContentView: View { &#9;&#9;@State private var eventPresented = false &#9;&#9;@State var fillColors: [Color] = Array(repeating: Color.white, count: 38) &#9;&#9;@State var buttonTitles: [String?] = Array(repeating: nil, count: 38) &#9;&#9; &#9;&#9;var body: some View { &#9;&#9;&#9;&#9;VStack { &#9;&#9;&#9;&#9;&#9;&#9;ZStack() { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;}.onAppear { makeButtons() } &#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;/* cal buttons */ &#9;&#9;&#9;&#9;&#9;&#9;VStack(spacing: 0.0) { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;HStack(spacing: 0.0) { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;ForEach((0...6), id: \.self) { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;Button(buttonTitles[$0] ?? "") { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;eventPresented = true &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.buttonStyle(BorderlessButtonStyle()) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.frame(width: 48, height: 48, alignment: .center) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.background(RoundedRectangle(cornerRadius: 2) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.fill(fillColors[$0]) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.shadow(color: Color.black.opacity(0.4), radius: 2, x: 0, y: 0) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;... &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;... &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;... &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;HStack(alignment: .top, spacing: 0.0) { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;ForEach((35...36), id: \.self) { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;Button(buttonTitles[$0] ?? "") { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.buttonStyle(BorderlessButtonStyle()) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.frame(width: 48, height: 48, alignment: .center) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.background(RoundedRectangle(cornerRadius: 2) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.fill(fillColors[$0]) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.shadow(color: Color.black.opacity(0.4), radius: 2, x: 0, y: 0) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.frame(width: 336.0, height: 48.0, alignment: .leading) &#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;}.frame(minWidth: 370, idealWidth: 370, maxWidth: 370, minHeight: 420, idealHeight: 420, maxHeight: 420, alignment: .top) &#9;&#9;} &#9;&#9; &#9;&#9;func makeButtons() { &#9;&#9;&#9;&#9;buttonTitles.removeAll() &#9;&#9;&#9;&#9;for i in 0..<38 { &#9;&#9;&#9;&#9;&#9;&#9;buttonTitles.append(String(i + 1)) &#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;fillColors.removeAll() &#9;&#9;&#9;&#9;for _ in 0..<2 { &#9;&#9;&#9;&#9;&#9;&#9;fillColors.append(Color.clear) &#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;for _ in 0..<36 { &#9;&#9;&#9;&#9;&#9;&#9;fillColors.append(Color.white) &#9;&#9;&#9;&#9;} &#9;&#9;} }
Dec ’20