这是在Playground完成的,只是为了简化.
class MyPrivateVar
{
private var priv: String?
}
var myInstance = MyPrivateVar()
myInstance.priv = "Something"
Run Code Online (Sandbox Code Playgroud)
没有编译器警告.事实上,自动完成显示priv没有问题.我的理解是,在班级{}的范围之外,我不应该看到任何私人的东西,func也不应该var.
我错过了什么吗?
在 Xcode 14 中,运行单元测试似乎是在创建模拟器“克隆”(名为“iPhone 的克隆 1/2..”)。在较旧的机器上,这可能需要很长时间。每次从运行应用程序切换到运行测试时都会发生这种情况。例如,运行应用程序将启动模拟器。运行测试将启动新的一个或多个模拟器(...的克隆),再次运行应用程序将重新加载原始模拟器。
有什么办法可以控制这个吗?这使得在旧机器上运行测试变得非常痛苦。
我似乎无法以任何方式从模拟器(到Mac粘贴板)复制文本.试图在模拟器中使用CMD-C和"复制"弹出窗口以及两者的所有组合.我可以在模拟器中粘贴但不能以任何方式将该文本"导出"到Mac.我可以从 Mac剪贴板粘贴(到模拟器),但不能反过来.
在我的应用程序上,我曾经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
在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中的设计更改.
我试图找出.playground文件到底是什么.如果它是一个源文件,它不能(据我所知)被项目中的其他swift文件看到,也不能被其他.playground文件看到,反之亦然.
项目是否应该有一个这样的文件?它们是一种快速文件吗?
我知道它(.playground文件)的作用,我无法弄清楚它是如何适合项目的.
我试图为Apple的CommonCrypto库找到某种参考,因为显然Apple没有任何明显的链接,谷歌给出的那些已经过时了,如下所示:
有什么暗示吗?是否有更好的库可用于开发具有大量加密功能的应用程序?
谢谢.
首先,我要提一下,这主要是效率问题.
有很多讨论关于在哪里进行帧计算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 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”就会崩溃。
让我加上为什么我认为这不是重复如何在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) 我们有一些代码,其中一个类嵌套在扩展中.在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)),那么项目编译得很好,但实际上并没有更多的光线.
一个重要的问题是随机生成的参数,还是实际桥接名称的实际链接?
SwiftUI持有是一种常见的View (struct)做法ObservableObject。由于 astruct不是引用类型,因此很容易忘记 is 保存着一个。
两者的答案都是肯定的。
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
class A {
var next: A
}
let a = A()
a.next …Run Code Online (Sandbox Code Playgroud) swift ×5
ios ×3
ios9 ×2
xcode6 ×2
commoncrypto ×1
cryptography ×1
ios13 ×1
ios8 ×1
swift2 ×1
uidocumentpickerviewcontroller ×1
xcode ×1
xcode14 ×1
xcode9 ×1