小编bau*_*sic的帖子

私人var可以从课外访问

这是在Playground完成的,只是为了简化.

class MyPrivateVar
{
    private var priv: String?
}

var myInstance = MyPrivateVar()

myInstance.priv = "Something"
Run Code Online (Sandbox Code Playgroud)

没有编译器警告.事实上,自动完成显示priv没有问题.我的理解是,在班级{}的范围之外,我不应该看到任何私人的东西,func也不应该var.

我错过了什么吗?

swift swift2

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

Xcode 14 单元测试克隆模拟器

在 Xcode 14 中,运行单元测试似乎是在创建模拟器“克隆”(名为“iPhone 的克隆 1/2..”)。在较旧的机器上,这可能需要很长时间。每次从运行应用程序切换到运行测试时都会发生这种情况。例如,运行应用程序将启动模拟器。运行测试将启动新的一个或多个模拟器(...的克隆),再次运行应用程序将重新加载原始模拟器。
有什么办法可以控制这个吗?这使得在旧机器上运行测试变得非常痛苦。

xcode14

21
推荐指数
1
解决办法
3641
查看次数

从iOS 9模拟器复制文本

我似乎无法以任何方式从模拟器(到Mac粘贴板)复制文本.试图在模拟器中使用CMD-C和"复制"弹出窗口以及两者的所有组合.我可以在模拟器中粘贴但不能以任何方式将该文本"导出"到Mac.我可以 Mac剪贴板粘贴(到模拟器),但不能反过来.

ios9

12
推荐指数
1
解决办法
469
查看次数

UIDocumentPickerViewController iOS13无法正常工作

在我的应用程序上,我曾经UIDocumentPickerViewController允许用户选择文件(导入),但是从iOS 13开始,该功能停止运行,基本上文档选择器处于打开状态,但用户无法选择文件(对文件进行任何操作均不执行任何操作) 。

我制作了一个简单的示例来隔离代码:

class ViewController: UIViewController, UIDocumentPickerDelegate {

    @IBAction func openDocumentPicker(_ sender: Any) {
        let types = [String(kUTTypePDF)]
        let documentPickerViewController = UIDocumentPickerViewController(documentTypes: types, in: .import)
        documentPickerViewController.delegate = self
        present(documentPickerViewController, animated: true, completion: nil)
    }

    func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
        print("Cancelled")
    }

    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        print("didPickDocuments at \(urls)")
    }

}
Run Code Online (Sandbox Code Playgroud)

示例项目:https : //github.com/Abreu0101/document-picker-iOS13-issue

参考: 在此处输入图片说明

uidocumentpickerviewcontroller ios13

11
推荐指数
1
解决办法
631
查看次数

在reloadInputViews调用之后,UITextField不再重新加载keyboardType

在iOS 7中,我可以在firstResponder(即时)更改键盘类型:

if (textField.text.length > 2) {

    textField.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
}
else
{
    textField.keyboardType = UIKeyboardTypeDefault;
}

[textField reloadInputViews];

// (Omitting some efficiency stuff to keep example to bare bones)
Run Code Online (Sandbox Code Playgroud)

这在Xcode 6/iOS 8下不再有效.文档主要反映了有关自定义键盘的更改.

使用辞职/成为第一响应者是(仍然)工作:

[textField resignFirstResponder];

// Make keyboard change

[textField becomeFirstResponder];
Run Code Online (Sandbox Code Playgroud)

但这只是一种矫枉过正的感觉.它正在撕裂和重建墙壁,只是为了改变它上面的图片.

这里有一个相关的帖子: UITextView似乎没有实现reloadInputViews

但似乎解决方案(在评论中)" 显然将其声明为UITextView而不是UIResponder会影响它在运行时的行为方式......现在它可以正常工作 "

在我的情况下它一个UITextField,我试图铸就UITextView以防万一.不行.

我会再次提到它在iOS7/Xcode5运作良好.

我真的不知道这是Xcode 6的'beta'问题,还是iOS 8中的设计更改.

xcode6 ios8

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

.playground是一个快速文件?谁能"看到"它?

我试图找出.playground文件到底是什么.如果它是一个源文件,它不能(据我所知)被项目中的其他swift文件看到,也不能被其他.playground文件看到,反之亦然.

项目是否应该有一个这样的文件?它们是一种快速文件吗?

我知道它(.playground文件)的作用,我无法弄清楚它是如何适合项目的.

swift xcode6 swift-playground

7
推荐指数
1
解决办法
2562
查看次数

iOS CommonCrypto参考

我试图为Apple的CommonCrypto库找到某种参考,因为显然Apple没有任何明显的链接,谷歌给出的那些已经过时了,如下所示:

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/Common%20Crypto.3cc.html

有什么暗示吗?是否有更好的库可用于开发具有大量加密功能的应用程序?

谢谢.

documentation cryptography ios commoncrypto

6
推荐指数
2
解决办法
8512
查看次数

`viewDidLayoutSubviews`中的帧计算

首先,我要提一下,这主要是效率问题.

有很多讨论关于在哪里进行帧计算viewWillAppear太早而且viewDidAppear太晚(视图已经可见).

常见的答案是进行帧计算viewDidLayoutSubviews.问题是,它被多次调用.更糟糕的是,最准确的呼叫,即所有帧都具有最终大小的呼叫是最后一个.据我所知,没有办法知道最后一个是哪个电话.

我们使用'framesAreSet'标志(初始化为false)和一个检查,如果frame不为零(类似self.view.frame.size.width != 0),'framesAreSet'为false,则进入,转动标志并仅计算一次.就像是:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    if (self.view.frame.size.width != 0 && !framesAreSet)
    {
        framesAreSet = true;

        //Calculate frames here
    }
} 
Run Code Online (Sandbox Code Playgroud)

这看起来不错,但实际上,检查类似的东西self.view.frame.size.width != 0不能保证确实设置了帧.viewDidLayoutSubviews将被调用的事实表明某些帧未设置为最终状态.

有一个很好的viewCompleteLayoutSubviews.当所有帧都被设置并且视图还不可见时,有什么最好的方法可以实现"一次性"帧计算?

(这可能是使用NSConstraints的视图的问题)

ios ios9

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

PHPhotoLibrary请求授权,而不是请求

为了进行测试,我试图重新创建系统“请求访问”弹出体验。

更新:
iOS 11下,删除App后,系统弹窗会再次显示。


(上一个问题)

应用程序第一次运行(也是唯一一次),系统弹出窗口显示,请求访问。之后,即使删除应用程序并重新启动设备也会再次触发该弹出窗口。

换句话说,设备“记住”用户请求并且无法重置它。

这是代码:

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

    switch (status) {
        case PHAuthorizationStatusAuthorized:
            NSLog(@"PHAuthorizationStatusAuthorized");
            break;

        case PHAuthorizationStatusDenied:
            NSLog(@"PHAuthorizationStatusDenied");
            break;
        case PHAuthorizationStatusNotDetermined:
            NSLog(@"PHAuthorizationStatusNotDetermined");
            break;
        case PHAuthorizationStatusRestricted:
            NSLog(@"PHAuthorizationStatusRestricted");
            break;
    }

}];
Run Code Online (Sandbox Code Playgroud)

当设置中关闭访问时,它会继续打印“PHAuthorizationStatusDenied”。但不显示任何弹出窗口。立即返回。

建议将“捆绑包显示名称”添加到 plist 中。尝试过没有效果,值为空、$(PRODUCT_NAME) 和不同的字符串。

清理项目,删除DrivedData(并每次从模拟器中删除应用程序)。没有运气。

更多信息:

一旦您在“设置”中关闭照片访问权限,Apple 示例代码“SamplePhotosApp”就会崩溃。

ios phphotolibrary

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

自定义错误类型初始化程序

让我加上为什么我认为这不是重复如何在Swift中提供具有错误类型的本地化描述?

提供的答案仍然会导致一些静态/类函数调用,而不是初始化器样式或需要转换为NSError(我想避免).


简要总结一下原因:

一个throws不声明错误类型的 Swift函数.我们无法强制catch传递一个简单符合Error协议的自定义类型.知道在do-catch方面,我们没有得到编译器的帮助,因为我们得到了什么类型(如果是自定义的)错误,默认情况下我们会期望已知的NSError属性.否则,我们需要简单地依赖文本文档来解释我们可以捕获的错误类型,因为catch只会传递一个Error类型.

现在,与NSError不同,Error是一种协议,其中我们获取的属性userInfo是只读的.所以我们求助于构造NSError类型,并将其转换为Error.


我试图创建一个简单的干净结构,返回一个错误类型(而不是NSError),我可以抛出:

throw MYError(domain: "com.somthing.error", code: 0, userInfo: [NSLocalizedDescriptionKey : "Something bad happened"])
Run Code Online (Sandbox Code Playgroud)

主要问题是设置的唯一方法NSLocalizedDescriptionKey是初始化NSError对象.这样做需要转换为Error类型(这是我试图避免的).

我首先尝试使用extension Error {...,但不能使用初始化程序.

如果我使用符合Error protocol(struct MyError: Error {...)的结构,我仍然localizedDescription只有get 的问题.

我使用的实际上是这样的:

struct MYError: Error {

    static func with(domain: String = "com.somthing.error", code: Int = 0, localizedDescription: String) -> Error {
        return NSError(domain: domain, code: code, userInfo: [NSLocalizedDescriptionKey : …
Run Code Online (Sandbox Code Playgroud)

swift

3
推荐指数
2
解决办法
2936
查看次数

嵌套类具有不稳定的名称.使用奇怪的参数修复@objc

我们有一些代码,其中一个类嵌套在扩展中.在Xcode 9中打开项目后,我们得到'嵌套类具有不稳定名称'警告.使用Xcode自动修复时,它生成一个@objc带有一些(生成?)参数.

例如:

struct Something {
}

extension Something {

    @objc(_TtCV16MyProject9Something4Some) class Some: NSObject, NSCoding {

        required init?(coder aDecoder: NSCoder) {

        }

        func encode(with aCoder: NSCoder) {

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些编译.但到底是_TtCV16MyProject9Something4Some什么?

它似乎是唯一的,因为如果我们在两个地方使用相同的一个,它将无法编译(一些通用的项目级编译器错误).

如果我_TtCV16MyProject9Something4Some用其他任何东西替换(比方说@objc(Something)),那么项目编译得很好,但实际上并没有更多的光线.

一个重要的问题是随机生成的参数,还是实际桥接名称的实际链接?

xcode swift xcode9

3
推荐指数
1
解决办法
829
查看次数

Swift - 持有闭包引用泄漏

编辑(讨论后):

SwiftUI持有是一种常见的View (struct)做法ObservableObject。由于 astruct不是引用类型,因此很容易忘记 is 保存着一个。

问题实际上应该是:

  1. 间接引用会导致保留周期吗?
  2. 保留循环可以涉及单个指针吗

两者的答案都是肯定的

  1. 结构 -> 类 -> 闭包{struct.class}
class ViewModel: ObservableObject
...
struct MyView: View {
    @ObservedObject var viewModel: ViewModel
    var body: some View {
        Button("Action") {
            viewModel?.handler {
                // ViewModel is retained here through self:
                // (MyView.viewModel)
                self.someAction()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 中SwiftUI,将自己“传递给”你的人并不是一个好习惯。ViewModel

  1. 持有指向自身的实例变量的类
    (这里讨论当外部头引用被移除时,ARC如何处理循环链表?
class A {
    var next: A
}
let a = A()
a.next …
Run Code Online (Sandbox Code Playgroud)

swift

-1
推荐指数
1
解决办法
487
查看次数