我在构建设置中定义了预处理器宏
FOO=BAR
Run Code Online (Sandbox Code Playgroud)
我希望将这个值按到一个可以传递给方法的Objective-C字符串文字中.以下#define不起作用,但它应该展示我想要实现的目标:
#define FOOLITERAL @"FOO" //want FOOLITERAL to have the value of @"BAR"
myMethodThatTakesAnNSString(FOOLITERAL);
Run Code Online (Sandbox Code Playgroud)
我希望我只是在某种程度上错过了显而易见的东西,但我似乎无法找到合适的预处理器伏都教来获得我需要的东西.
cocoa cocoa-touch objective-c stringification c-preprocessor
它似乎不像UIButton instrinsicSize和/或sizeToFit考虑到标题左边缘插入,或者某些东西搞砸了我的期望.
为了演示,我在视图中有两个自定义类型按钮,标题都是"按钮".我想在标题左侧的按钮中添加图像.
var image = UIImage(named: "circledPlay")
image = image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
self.button1.setImage(image, forState: UIControlState.Normal)
self.button1.invalidateIntrinsicContentSize()
self.button1.sizeToFit()
self.button2.setImage(image, forState: UIControlState.Normal)
self.button2.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0)
self.button2.invalidateIntrinsicContentSize()
self.button2.sizeToFit()
Run Code Online (Sandbox Code Playgroud)
结果如下:
请注意第二个按钮被截断.
所以我的问题是,如果有人之前已经看过这个(并希望有一个解决方案)或者我感到困惑,这表现得如预期的那样(并且希望知道正确的方法)?
我无法完全掌握协议和泛型的问题。
在下面的代码中,用 ERROR HERE 注释标记,我收到以下错误:
成员“protocolMethod”不能用于“any Protocol1”类型的值;考虑使用通用约束来代替
我认为它抱怨主要是因为参数的类型item
至少在某种程度上未解决?不幸的是,我发现这个建议没有帮助,因为我不知道通用约束在这里有何帮助(至少就我对它们的理解而言)。
老实说,我觉得我可能对 Swift 要求太多了。
有人可能会看到问题是什么或有尝试解决此问题的建议吗?
添加于 12/26/22 - 作为进一步的背景,导致错误出现的原因是将参数添加item
到protocolMethod
协议上的方法中,这几乎表明它是问题的核心。
protocol Protocol1
{
associatedtype DataItem
func protocolMethod(item : DataItem)
}
protocol Protocol2 {
associatedtype AType1: Hashable
//...
}
class Class1<Type1: Protocol2>: NSObject
{
typealias Item = Type1.AType1
var delegate : (any Protocol1)?
private func method1(item: Item)
{
delegate?.protocolMethod(item : item) //ERROR HERE
}
}
Run Code Online (Sandbox Code Playgroud)
(使用最新的Xcode)
我正在编写一个将删除文件的应用程序。如果该卷支持“废纸folder”文件夹,我想将文件移到那里,否则只需将其删除即可。
可能是我的搜索莫霍奇失败了,但我找不到如何做到这一点。
这里的目的是做类似(伪代码)的事情:
if (itemURL on volume that supports Trash)
use trashItemAtURL:resultingItemURL:error:
else
use removeItemAtURL:error:
Run Code Online (Sandbox Code Playgroud)
我知道recycleURLs:completionHandler:但是,例如对于SMB卷,它会弹出一个对话框,说明如何立即删除文件。我想单独处理文件,以便更新显示。我想我可以使用recycleURLs:completionHandler:如果文件系统事件可以在SMB卷上运行,但我不确定它们是否可以运行。
Anyhoo ..是否缺少某些API或我似乎找不到的某些推荐技术?
我正在尝试设置CloudKit CKDatabaseSubscription并尝试保存它,出现以下错误:
'“未认证”(9/1002); “用户设置拒绝了CloudKit访问”;3.0秒后重试
我可以通过应用程序在私有数据库上创建记录,没有任何问题,但是订阅将无法保存。
<snip>
container = CKContainer(identifier: "<valid identifier>")
publicDB = container.publicCloudDatabase
privateDB = container.privateCloudDatabase
createSubscriptions()
</snip>
func createSubscriptions()
{
let sub = CKDatabaseSubscription(subscriptionID: "main")
let noteInfo = CKNotificationInfo()
noteInfo.shouldSendContentAvailable = true
sub.notificationInfo = noteInfo
let op = CKModifySubscriptionsOperation(subscriptionsToSave: [sub], subscriptionIDsToDelete: nil)
op.qualityOfService = .utility
op.modifySubscriptionsCompletionBlock = {(subscriptions, name, error) in
print ("error-\(error)")
}
privateDB.add(op)
}
Run Code Online (Sandbox Code Playgroud)
因此,在上面的代码中,从块中的打印内容打印出了以上错误。一切都在范围内,可以正常编译,用户可以登录iCloud等。在模拟器和设备上均发生。
CloudKit订阅是否需要ASPN证书?还是我犯了一些错误?
swift ×3
cocoa ×2
cocoa-touch ×2
ios ×2
cloudkit ×1
generics ×1
macos ×1
objective-c ×1
uibutton ×1