我正在尝试实现这种新paymentQueue(_:shouldAddStorePayment:for:)方法,以便我的应用程序可以直接从App Store处理IAP.
我正在使用itms-services://网址来测试它,就像它在这里说的那样.
问题是,我SKPaymentTransactionObserver是一个特定的视图控制器,如果在打开itms-services://链接时它不可见,则不会调用委托方法.
我该怎么办?我想我必须检测用户是否来自App Store推送正确的视图控制器,但我不知道如何.我现在能想到的唯一另一个选择就是让App Delegate成为一个SKPaymentTransactionObserver,但这看起来真的很麻烦,当我尝试它时我无法让它工作.还有其他方法吗?
我知道这是应该发生的事情,但它导致了我不知道如何修复的问题.
我想在键盘显示时向上移动我的视图,以便我的文本字段保持可见.
我的文本字段有数字键盘.
我使用通知并keyboardWillShow/Hide在选择文本字段时向上/向下移动视图.
现在假设我点击一个文本字段,然后切换到另一个使用不同键盘(而不是数字键盘)的应用程序.keyboardWillShow用错误键盘的大小调用(来自另一个应用程序的键盘)并且我的视图移动的数量错误(它根本不应该移动).因此,当我回到我的应用程序时,我的视图位于错误的位置,键盘甚至没有显示,然后keyboardWillHide被调用,视图被移回原位(无处不在).但首先keyboardWillShow不应该为其他应用程序调用它.
我正在删除通知viewWillDisappear,但这仍然发生...也许keyboardWillShow是在viewWillDisappear为我的之前调用其他应用程序?
这是我的代码:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
for subview in self.view.subviews {
if subview.isKindOfClass(UITextField) {
let textField = subview as! UITextField
textField.addTarget(self, action: "textFieldDidReturn:", forControlEvents: UIControlEvents.EditingDidEndOnExit)
textField.addTarget(self, action: "textFieldDidBeginEditing:", forControlEvents: UIControlEvents.EditingDidBegin)
}
}
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func keyboardWillShow(notification: NSNotification) { …Run Code Online (Sandbox Code Playgroud) 我从XCode获取这些崩溃报告(我在底部粘贴了一个),我无法重现错误或弄清楚问题是什么.
从回溯中我认为它可能与这些decodeObject东西有关......我确实遇到了新的decodeBool和decodeDouble函数的问题,所以为了确保我做了一个NSCoder扩展:
func safeDecodeDouble(key: String) -> Double? {
if self.containsValue(forKey: key) {
if let value = self.decodeObject(forKey: key) as? Double {
return value
}
return self.decodeDouble(forKey: key)
}
return nil
}
func safeDecodeBool(key: String) -> Bool? {
if self.containsValue(forKey: key) {
if let value = self.decodeObject(forKey: key) as? Bool {
return value
}
return self.decodeBool(forKey: key)
}
return nil
}
func safeDecodeDate(key: String) -> Date? {
if self.containsValue(forKey: key) {
if let value = …Run Code Online (Sandbox Code Playgroud) 这里有另一个问题,解决了类似的问题,但在这种情况下,Xcode的行为是正确的,只是烦人.
然而,在我的情况下,我认为它实际上是一个错误:
该标签可以有无限数量的行,因此它永远不会被剪裁,文本将会破坏.
它适用于每个本地化:
我希望标签居中,我希望文本距离边距至少20像素,因此我为前导和尾随设置了固定约束.Xcode希望我将其中一个更改为"大于或等于"约束,但在这种情况下,文本将不会完全居中(我尝试过).
我想要的只是中心文本,它不会太靠近边距,但现在我无法在不触发警告的情况下完成.
有想法该怎么解决这个吗?它真的是一个错误,还是我做错了什么?
编辑:这是显示错误的屏幕截图.约束不是直接在视图控制器中,而是在我用作表视图的背景的子视图中.如果我删除这些限制,警告就会消失; 如果我把它们添加回去,它会再次出现.我在一个新项目中试过这个并且无法重现它,我不知道它为什么会在这里发生.
编辑:
这是另一个例子.当右边约束设置为"大于或等于"时,所有的好:
一旦我将它设置为"相等",繁荣:
我正在尝试使用核心数据和nsfetchresultscontroller对表视图中的单元格进行重新排序。我发现了使用目标C进行这种操作的几种方法(我一无所知),并尝试快速实现它们,这是我想到的:
var books: Array<AnyObject> = []
// Override to support rearranging the table view.
override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {
books = fetchedResultsController.fetchedObjects!
let book = fetchedResultsController.objectAtIndexPath(fromIndexPath)
self.fetchedResultsController.delegate = nil
books.removeAtIndex(fromIndexPath.row)
books.insert(book, atIndex: toIndexPath.row)
var i = 0
for book in books {
book.setValue(i++, forKey: "position")
}
try! context.save()
self.fetchedResultsController.delegate = self
}
Run Code Online (Sandbox Code Playgroud)
委托和上下文引用位于另一个文件的扩展名中。使用此代码有时可以工作,有时却不行。我更改了顺序,再次运行该应用程序,但顺序却完全不一样,我无法确定。特别是当我一次移动多行时。而且,如果我将每个对象的“位置”属性打印到控制台,我可以看到它们确实没有正确更新。但是为什么不呢?
我究竟做错了什么?有什么更好的选择?
提前致谢,
丹尼尔
编辑:
好的,这是工作代码:
func initializeFetchedResultsController() {
let request = NSFetchRequest(entityName: "Book")
let sortDescriptor = NSSortDescriptor(key: "position", ascending: true)
request.sortDescriptors = …Run Code Online (Sandbox Code Playgroud) 显然,TestFlight现在接受Xcode 9版本,因此我尝试为iOS 11 beta版的用户上传我的应用程序的新版本进行测试.
该应用程序已正确上传,但随后我收到一封电子邮件说:
处理您的iOS应用程序时,在应用程序细化过程中发生错误,您的应用程序无法细化.[...]有关可能有助于解决此问题的信息,请参阅技术说明2432.
我检查了链接,它说导出应用程序进行临时部署以重现错误.所以我这样做了,这就是我得到的:
无法在Frameworks/libswiftCore.dylib中验证bitcode:
错误:bitcode 02的clang选项验证失败(无法识别的参数:-disable-llvm-passes)
在日志中,我的应用程序使用的每个框架都会再次出现错误.例如:
code = 0;
description = "Failed to verify bitcode in Realm.framework/Realm:\nerror: Clang option verification failed for bitcode 001 (unrecognized arguments: -disable-llvm-passes)\n\n";
info = {
};
level = ERROR;
type = "malformed-payload";
Run Code Online (Sandbox Code Playgroud)
许多默认库也是如此,例如libswiftFoundation.dylib,libswiftUIKit.dylib等等.
那我现在该怎么办?
PS:我不想禁用bitcode.
编辑:我也尝试使用Xcode 9进行存档并使用Xcode 8导出.我得到了相同的错误.
我有一个运行计时器的应用程序,即使该应用程序退出或手机已关闭,计时器也应保持运行。所以我正在尝试使用shouldSaveApplicationState和shouldRestoreApplicationState。我将这两种方法都添加willFinishLaunchingWithOptions到了appDelegate中,并为涉及的每个视图控制器,导航控制器和标签栏控制器设置了恢复ID。然后在视图控制器上,我要还原,我这样做:
override func encodeRestorableStateWithCoder(coder: NSCoder) {
coder.encodeObject(startDate, forKey: "startDate")
coder.encodeObject(startTime, forKey: "startTime")
coder.encodeObject(elapsedTime, forKey: "elapsedTime")
coder.encodeObject(playing, forKey: "playing")
coder.encodeObject(timerLabel.text, forKey: "timerLabelText")
super.encodeRestorableStateWithCoder(coder)
}
override func decodeRestorableStateWithCoder(coder: NSCoder) {
startDate = coder.decodeObjectForKey("startDate") as! NSDate
startTime = coder.decodeObjectForKey("startTime") as! NSTimeInterval
elapsedTime = coder.decodeObjectForKey("elapsedTime") as! NSTimeInterval
playing = coder.decodeObjectForKey("playing") as! Bool
timerLabel.text = (coder.decodeObjectForKey("timerLabelText") as! String)
super.decodeRestorableStateWithCoder(coder)
}
override func applicationFinishedRestoringState() {
if playing {
elapsedTime += startDate.timeIntervalSinceNow
play()
}
}
Run Code Online (Sandbox Code Playgroud)
现在这是奇怪的部分。当我的手机连接到Xcode时,我使用Xcode的播放和停止按钮启动和退出应用程序,一切正常。但是,当我尝试将手机与Xcode断开连接时,即使我根本没有设置状态恢复,该应用程序也会完全忽略它,只显示第一个视图控制器。而且我什至无法调试,因为当我将手机连接到Xcode时,它可以正常工作。同一件事在模拟器上发生。如果我使用Xcode的按钮,则恢复正常。如果我只是从模拟器本身打开和关闭应用程序,则不会。
有任何想法吗?
class Book: Object {
// (…)
var readingSessions: [ReadingSession] {
return linkingObjects(ReadingSession.self, forProperty: "book")
}
}
class ReadingSession: Object {
// (…)
var book: Book?
var aComputedProperty: Int {
print(self) // Prints ReadingSession { book = Book { (…) } (…) }
print(self.book) // Prints nil
// (…)
}
}
Run Code Online (Sandbox Code Playgroud)
代码几乎说明了一切.如果我self从我的计算属性中打印,它会像我期望的那样在其他属性中打印相关对象.但是,如果我只是尝试获取该对象,它将返回nil.这应该发生吗?难道我做错了什么?
提前致谢,
丹尼尔
编辑:似乎问题实际上与计算属性无关.只是从常规视图控制器调用它给我同样的问题:
let session = ReadingSession()
// (…)
print(session) // This returns every property, including the Book
print(session.book) // This returns nil
Run Code Online (Sandbox Code Playgroud)
但这并不总是发生.在我的代码的某些部分,我做同样的事情,它按预期工作,在其他部分发生这种情况.所以我想我只是在某个地方犯了一些愚蠢的错误,但我不知道是什么原因引起的.
let …Run Code Online (Sandbox Code Playgroud) ios ×7
swift ×5
xcode ×3
ios11 ×2
app-store ×1
constraints ×1
core-data ×1
nscoder ×1
nscoding ×1
realm ×1
storyboard ×1
testflight ×1
uitableview ×1
xcode9 ×1
xcode9-beta ×1