例如,我有两个名为file1.swift和file2.swift的文件.
file1.swift
import UIKit
class A: B {
}
Run Code Online (Sandbox Code Playgroud)
file2.swift
import UIKit
class C: A{
}
Run Code Online (Sandbox Code Playgroud)
我正在读取公共类不能在模块之外进行子类化.这里我有子类C.我试图理解模块在这里意味着什么.我为这两个文件导入了相同的模块UIKit.那么这两个文件是同一个模块吗?这样我就可以继承了.或者两个文件都有不同的模块,即使我导入相同的UIKit?
任何人都可以解释什么是模块?
资源:
具有公共访问权限或任何更严格的访问级别的类只能在定义它们的模块中进行子类化.
具有公共访问权限或任何更具限制性的访问级别的类成员只能在定义它们的模块中被子类覆盖.
我RPSystemBroadcastPickerView用来显示一个选择器视图,用户可以从中选择一个广播服务来记录屏幕.根据文档,preferredExtension应该允许我设置选择器显示哪个广播扩展.
代码非常简单:
let broadcastPickerView = RPSystemBroadcastPickerView(frame: CGRect(x: 0, y: 0, width: 51, height: 51))
view.addSubview(broadcastPickerView)
broadcastPickerView.preferredExtension = "com.milan.nosal.broadcast-extension"
broadcastPickerView.backgroundColor = .clear
broadcastPickerView.showsMicrophoneButton = false
Run Code Online (Sandbox Code Playgroud)
"com.milan.nosal.broadcast-extension"我希望选择器提供的扩展的包标识符在哪里(我多次检查其正确性).
但是,当点击控件时,弹出窗口首先显示空选:
关闭它后,再次点击控件,它会显示正确的扩展名.这仅在应用程序安装(或重新安装)后才会发生,在显示后,它会始终显示.
这是iOS 12测试版的错误,还是我做错了什么?我可以"预注册"扩展程序来解决这个问题吗?
编辑:
发布应用程序后,我们遇到了与用户相同的问题,但这次甚至没有多次点击控件有帮助 - 选择器总是空的!似乎扩展安装正确,因为它可以从控制中心启动.
现在正式发布.
我对代码块或"范围"的定义感到困惑.苹果公司的卫士文件说:保护声明的其他部分......
"必须转移控制以退出出现保护声明的代码块."
其他在线消息来源称,守卫声明必须退出其存在的"范围".
所以请参考下面的示例代码:
func testGuardControlFlow () {
let x = 2
let y = 2
func embededFunc () {
if y == 2 {
guard x == 1 else {
print("oops, number is not 1")
return
}
print ("from in embededFunc")
}
print ("I still want this to print even if x != 1")
}
embededFunc()
print("Great, return still allows this to be printed.")
}
testGuardControlFlow()
Run Code Online (Sandbox Code Playgroud)
根据我目前对'范围'的理解,代码
if y == 2 {....}
Run Code Online (Sandbox Code Playgroud)
创建一个新的范围,即{}之间.并且考虑到这个假设,后卫只会逃避这个范围.但事实并非如此.此实例中的Guard不会放置它所放置的函数,而不管它是否隐藏在if子句中.
我完全误解了"范围"的含义吗?范围是指方法中包含的代码吗?如果是这样,if语句中存在的'space'的正确术语是什么?
我已经使用Facebook SDK for swift通过facebook实现了登录.它在iOS 10.3上按预期工作,但在iOS 11上显示并显示其他弹出窗口,要求用户允许通过facebook.com登录.
这会在登录过程中再添加一个步骤,从而减慢登录过程.有没有办法如何配置应用程序默认允许这样,从而删除恼人的弹出窗口?
我正在使用通过可可豆荚添加的facebook-sdk-swift 0.2.0(FBSDK版本为4.26.0).
配置在info.plist:
<key>FacebookAppID</key>
<string>xxxxxxxxxxxxxxx</string>
<key>FacebookDisplayName</key>
<string>XXXXX</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>facebook</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fbxxxxxxxxxxxxxxx</string>
</array>
</dict>
</array>
Run Code Online (Sandbox Code Playgroud)
代码AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: …Run Code Online (Sandbox Code Playgroud) 我有一个带有自定义附件视图的键盘。我可以通过注册keyboardWillShowNotification通知来获得它的高度:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShowNotification(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
Run Code Online (Sandbox Code Playgroud)
和回调处理程序:
@objc fileprivate func keyboardWillShowNotification(notification: NSNotification) {
guard let keybrdEndFrame = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
print(">>>> height: \(keybrdEndFrame.size.height)")
}
Run Code Online (Sandbox Code Playgroud)
然而,在这keybrdEndFrame.size.height给了我键盘的高度 + 附件视图的高度。虽然在我的特殊情况下我知道附件视图的高度(因为我已经实现了它),所以我可以计算键盘的高度,我想知道是否有一个更通用的解决方案,我可以将计算与自定义附件视图。
所以我的问题是 - 有没有办法在没有附件视图的情况下检索键盘的高度?或者,有没有办法只检索当前与键盘一起显示的附件视图的高度?
我用来UIViewPropertyAnimator动画化与我的视图的交互(在卡片之间滑动)。一切都工作正常,直到最近我在生产中遇到以下崩溃:
致命异常:NSInternalInconsistencyException
释放已暂停或已停止的属性动画器是错误的。属性动画师必须完成动画制作或明确停止并完成才能释放。
由于 Crashlytics 并没有真正提供更多上下文,或者我可以做的是确保我的所有动画师始终在viewController发布之前完成。
在我的一次尝试中,我试图确保当我创建一个新的动画师时,旧的动画师会停止并完成:
fileprivate var runningAnimator: UIViewPropertyAnimator? {
didSet {
if let oldValue = oldValue {
print(">> before stopping: \(oldValue.isRunning)")
oldValue.stopAnimation(false)
print(">> after stopping: \(oldValue.isRunning)")
oldValue.finishAnimation(at: .end)
print(">> after finishing: \(oldValue.isRunning)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,现在我的应用程序开始因以下错误而崩溃:
'NSInternalInconsistencyException',原因:'finishAnimationAtPosition:只能在停止的动画师上调用!'
在输出上打印时:
>> before stopping: true
>> after stopping: true
Run Code Online (Sandbox Code Playgroud)
很明显,oldValue即使在调用后动画师仍在运行oldValue.stopAnimation(false)。
这怎么可能?
我有一个集合视图,每个单元格都有一个textView.这是我的textview约束设置
textView.topAnchor.constraint(equalTo: object1.bottomAnchor).isActive = true
textView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
Run Code Online (Sandbox Code Playgroud)
...我的textView的宽度和高度.
现在,由于if条件,我想将textView的topAnchor更改为object 2 bottom anchor而不是object 1 bottom anchor.但是,当我输入下面的代码时,我会通过破坏约束错误来尝试恢复.
一旦它已经设置,有没有人知道改变顶部锚的方法?
if (aCondition){
textView.topAnchor.constraint(equalTo: object2.bottomAnchor).isActive = true
}else{
textView.topAnchor.constraint(equalTo: object1.botttomAnchor).isActive = true
}
Run Code Online (Sandbox Code Playgroud) iOS 11 中有这个大标题功能,当UITableViewController表格滚动到顶部时显示大标题,当用户从顶部滚动表格时会折叠为标准小标题。这是标准行为。我需要导航控制器的行为有所不同 - 我需要始终显示大标题。如何实现这一目标?
以下代码没有帮助,滚动时它仍然会崩溃。
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
Run Code Online (Sandbox Code Playgroud) Swift 编程新手,我的错误的原因是什么,我该如何解决?非常感谢。
导入 UIKit
导入照片
类 PhotosViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource , UICollectionViewDelegateFlowLayout, UIImagePickerControllerDelegate, UINavigationControllerDelegate
{
@IBOutlet 弱 var myCollectionView:UICollectionView!
var imagesArray = [UIImage]()
覆盖 func viewDidLoad(){
super.viewDidLoad()
myCollectionView.delegate = self
myCollectionView.dataSource = self
}
@IBAction func addPhoto(_ sender: AnyObject) {
让选择器:UIImagePickerController = UIImagePickerController()
picker.sourceType = .photoLibrary
picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
选择器.delegate = self
picker.allowsEditing = false
self.present(选择器,动画:true,完成:nil)
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! 细胞
cell.configurecell(imagesArray[indexPath.row])
返回单元格
}
func …