小编Mil*_*sáľ的帖子

模块在swift中意味着什么?

例如,我有两个名为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?

任何人都可以解释什么是模块?

资源:

具有公共访问权限或任何更严格的访问级别的类只能在定义它们的模块中进行子类化.

具有公共访问权限或任何更具限制性的访问级别的类成员只能在定义它们的模块中被子类覆盖.

swift

13
推荐指数
1
解决办法
7645
查看次数

ReplayKit的RPSystemBroadcastPickerView没有显示preferredExtension

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测试版的错误,还是我做错了什么?我可以"预注册"扩展程序来解决这个问题吗?

编辑:

发布应用程序后,我们遇到了与用户相同的问题,但这次甚至没有多次点击控件有帮助 - 选择器总是空的!似乎扩展安装正确,因为它可以从控制中心启动.

现在正式发布.

ios swift replaykit ios12

13
推荐指数
2
解决办法
1864
查看次数

如果Swift'guard'语句必须退出范围,范围的定义是什么?

我对代码块或"范围"的定义感到困惑.苹果公司的卫士文件说:保护声明的其他部分......

"必须转移控制以退出出现保护声明的代码块."

其他在线消息来源称,守卫声明必须退出其存在的"范围".

所以请参考下面的示例代码:

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'的正确术语是什么?

scope swift

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

Facebook登录在iOS 11上显示另一个确认弹出窗口

我已经使用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)

facebook ios facebook-login swift ios11

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

如何在没有输入附件视图的情况下检测键盘高度?

我有一个带有自定义附件视图的键盘。我可以通过注册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给了我键盘的高度 + 附件视图的高度。虽然在我的特殊情况下我知道附件视图的高度(因为我已经实现了它),所以我可以计算键盘的高度,我想知道是否有一个更通用的解决方案,我可以将计算与自定义附件视图。

所以我的问题是 - 有没有办法在没有附件视图的情况下检索键盘的高度?或者,有没有办法只检索当前与键盘一起显示的附件视图的高度?

uikeyboard ios inputaccessoryview

7
推荐指数
0
解决办法
553
查看次数

UIViewPropertyAnimator 未在 stopAnimation 上停止

我用来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)

这怎么可能?

animation ios swift uiviewpropertyanimator

6
推荐指数
1
解决办法
3823
查看次数

如何在Swift中以编程方式更改布局约束?

我有一个集合视图,每个单元格都有一个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 nslayoutconstraint swift

6
推荐指数
1
解决办法
7831
查看次数

如何直接在上下文菜单而不是服务子菜单中添加mac OS服务项目?

我正在为Mac OS实施上下文服务。在支持服务的应用程序中选择文本时,新的子项目将添加到服务菜单。我遵循了《服务实施指南》

现在,这按预期工作。现在如何将项目从“服务”菜单移到直接在上下文菜单中(这样,用户不必浏览“服务”就可以直接使用我的服务)?那有可能吗?

编辑:经过更多研究后,我仍然没有任何好转。例如,此SO答案声称不可能仅通过服务在菜单中直接添加上下文菜单项。另一方面,这个SO答案声称它是可能的,并提供了更多资源的一些链接-但是,链接到其中的示例代码不再位于Apple网站上,并且链接的教程似乎也已经过时了(其所有资源都指向不存在的页面)。

macos cocoa

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

如何在 iOS 11 中通过 UITableView 关闭调整大标题?

iOS 11 中有这个大标题功能,当UITableViewController表格滚动到顶部时显示大标题,当用户从顶部滚动表格时会折叠为标准小标题。这是标准行为。我需要导航控制器的行为有所不同 - 我需要始终显示大标题。如何实现这一目标?

以下代码没有帮助,滚动时它仍然会崩溃。

navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
Run Code Online (Sandbox Code Playgroud)

uitableview ios swift ios11

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

Swift 错误 - 使用未声明的类型“单元格” - 集合视图

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 …

ios uicollectionview swift

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