小编vag*_*ant的帖子

预处理器宏值到Objective-C字符串文字

我在构建设置中定义了预处理器宏

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

26
推荐指数
2
解决办法
1万
查看次数

UIButton大小错误的图像和标题插入

它似乎不像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)

结果如下:

屏幕截图

请注意第二个按钮被截断.

所以我的问题是,如果有人之前已经看过这个(并希望有一个解决方案)或者我感到困惑,这表现得如预期的那样(并且希望知道正确的方法)?

uibutton ios swift

10
推荐指数
2
解决办法
5592
查看次数

不理解“成员 '<func>' 不能用于类型 'any <type>' 的值;请考虑使用通用约束”错误

我无法完全掌握协议和泛型的问题。

在下面的代码中,用 ERROR HERE 注释标记,我收到以下错误:

成员“protocolMethod”不能用于“any Protocol1”类型的值;考虑使用通用约束来代替

我认为它抱怨主要是因为参数的类型item至少在某种程度上未解决?不幸的是,我发现这个建议没有帮助,因为我不知道通用约束在这里有何帮助(至少就我对它们的理解而言)。

老实说,我觉得我可能对 Swift 要求太多了。

有人可能会看到问题是什么或有尝试解决此问题的建议吗?

添加于 12/26/22 - 作为进一步的背景,导致错误出现的原因是将参数添加itemprotocolMethod协议上的方法中,这几乎表明它是问题的核心。

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)

generics swift swift-protocols

10
推荐指数
1
解决办法
5444
查看次数

如何确定卷是否支持垃圾桶?

我正在编写一个将删除文件的应用程序。如果该卷支持“废纸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或我似乎找不到的某些推荐技术?

macos cocoa

5
推荐指数
1
解决办法
396
查看次数

保存CKDatabaseSubscription时获得“用户设置拒绝了CloudKit访问”

我正在尝试设置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证书?还是我犯了一些错误?

cocoa-touch ios swift cloudkit

2
推荐指数
1
解决办法
844
查看次数