小编JGu*_*Guo的帖子

在同步非隔离上下文中调用主参与者隔离实例方法 XXX

我正在尝试向 UIButton 添加异步 do/catch/defer 操作。但是,如果我只是调用 defer 块中的方法,则会收到Call to main actor-isolated instance method XXX in a synchronous nonisolated context错误。我发现的解决方法是将其包装在另一个Task块中,如下所示。只是想检查这是否是正确的方法?如果有人能解释该错误消息的实际含义,那就太好了。

@objc private func post(_ sender: UIButton) {
    Task {
        // defer { dismiss(animated: true) } -- Doesn't work
        defer { Task { await dismiss(animated: true) } }
        do {
            try await doSomethingAsync()
        } catch {
            print(error)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

async-await swift swift-concurrency

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

Android数据绑定:属性更改时视图不会更新

首先让我开始展示代码:

build.gradle(模块):

android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
dataBinding {
    enabled = true
}
defaultConfig {
    applicationId "com.example.oryaa.basecalculator"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}


dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.google.android.gms:play-services-appindexing:8.1.0'
Run Code Online (Sandbox Code Playgroud)

activity_main.xml中:

<data>
    <import type="android.view.View" />
    <variable
        name="baseCalcModel"
        type="com.example.oryaa.basecalculator.BaseCalcModel">
    </variable>
</data>  <TextView
        android:id="@+id/resultOutput"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/resultTextView"
        android:textColor="@color/DarkBlue"
        android:text="@{baseCalcModel.calcResult}"
        android:textSize="32dp" />
Run Code Online (Sandbox Code Playgroud)

MainActicity.java:

public class MainActivity extends AppCompatActivity {

EditText userInput = …
Run Code Online (Sandbox Code Playgroud)

java android observable android-databinding

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

未解决的参考:BR(Android Studio)

我的顶级build.gradle:

buildscript {
    ext.kotlin_version = '1.2.41'
    ext.lifecycle_version = "1.1.1"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
Run Code Online (Sandbox Code Playgroud)

我的项目级build.gradle:

android {
    ...
    dataBinding {
        enabled = true
    }
}

dependencies {
    ...
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}
Run Code Online (Sandbox Code Playgroud)

我还android.databinding.enableV2=true为每个Google文档添加了gradle.properties(https://developer.android.com/topic/libraries/data-binding/start)

当我尝试运行时,它Unresolved reference: BR在我的BaseViewHolder班级中显示错误.似乎BR已经正确生成了类,但是.../R.java当我将鼠标移到类名上时,它还会在文件中找到重复的类.我做错了什么?

fun bind(obj: Any) {
        binding.setVariable(BR.obj, obj)
        binding.executePendingBindings()
}
Run Code Online (Sandbox Code Playgroud)

kotlin android-studio android-databinding

14
推荐指数
3
解决办法
6144
查看次数

Kotlin将List转换为vararg

我有类型的输入数据 List<UnitWithComponents>

class UnitWithComponents {
    var unit: Unit? = null
    var components: List<Component> = ArrayList()
}
Run Code Online (Sandbox Code Playgroud)

我想将数据转换varargUnit

目前我正在做*data.map { it.unit!! }.toTypedArray()。有更好的方法吗?

list variadic-functions kotlin

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

交互式关闭模态视图控制器时出现故障

我正在使用UIViewControllerAnimatedTransitioningUIPercentDrivenInteractiveTransition以交互方式关闭一个模态呈现的视图控制器.没什么太花哨的.但我注意到,当交互开始时偶尔会出现一个小问题.如果使用.curveEaseOut选项进行动画制作会变得更加明显.我正在关注的一些在线教程(https://www.thorntech.com/2016/02/ios-tutorial-close-modal-dragging/)也会发生同样的事情.当我第一次将它向下拖动时,你可以看到gif中的故障.有什么建议?

在此输入图像描述

MyDismissAnimator

class SlideInDismissAnimator: NSObject, UIViewControllerAnimatedTransitioning {

    // ...

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

        guard let toVC = transitionContext.viewController(forKey: .to), 
        let presentedVC = transitionContext.viewController(forKey: .from) else {return}

        let presentedFrame = transitionContext.finalFrame(for: presentedVC)
        var dismissedFrame = presentedFrame
        dismissedFrame.origin.y = transitionContext.containerView.frame.size.height

        transitionContext.containerView.insertSubview(toVC.view, belowSubview: presentedVC.view)
        }
        let duration = transitionDuration(using: transitionContext)

        UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: {
            presentedVC.view.frame = dismissedFrame
        }) { _ in
            if transitionContext.transitionWasCancelled {
                toVC.view.removeFromSuperview()
            }
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

interactive modalviewcontroller ios swift

7
推荐指数
2
解决办法
1828
查看次数

Android Room类型转换多个枚举类型

我正在为我的Room数据库编写一个类型转换器.我有几个自定义枚举类,我想将它们存储在数据库中时将它们全部转换为它的序数.因此,有没有任何方法可以简化它(例如传递通用枚举类型),而不是为每个类编写以下内容?

class Converter {

    @TypeConverter
    fun toOrdinal(type: TypeA): Int = type.ordinal

    @TypeConverter
    fun toTypeA(ordinal: Int): TypeA = TypeA.values().first { it.ordinal == ordinal }

    @TypeConverter
    fun toOrdinal(type: TypeB): Int = type.ordinal

    @TypeConverter
    fun toTypeB(ordinal: Int): TypeB = TypeB.values().first { it.ordinal == ordinal }

    ...
}
Run Code Online (Sandbox Code Playgroud)

enums kotlin android-room

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

如何正确实现导航器模式

我正在关注 John Sundell 的帖子以实现导航器模式(https://www.swiftbysundell.com/posts/navigation-in-swift)。基本思想是,与 Coordinator 模式相比,每个视图控制器可以简单地调用,navigator.navigate(to: .someScreen)而不必知道其他视图控制器。

我的问题是,因为为了构造一个视图控制器我需要一个导航器,为了构造一个导航器我需要一个导航控制器,但我想让视图控制器成为导航控制器的根,解决这个问题的最佳方法是什么以一种尊重依赖注入最佳实践的方式循环依赖?

下面是 Sundell 说明的导航器模式的想法

航海家

protocol Navigator {
    associatedtype Destination    
    func navigate(to destination: Destination)
}

class LoginNavigator: Navigator {
    enum Destination {
        case loginCompleted(user: User)
        case signup
    }

    private weak var navigationController: UINavigationController?
    private let viewControllerFactory: LoginViewControllerFactory

    init(navigationController: UINavigationController,
         viewControllerFactory: LoginViewControllerFactory) {
        self.navigationController = navigationController
        self.viewControllerFactory = viewControllerFactory
    }

    func navigate(to destination: Destination) {
        let viewController = makeViewController(for: destination)
        navigationController?.pushViewController(viewController, animated: true)
    }

    private func makeViewController(for destination: Destination) -> …
Run Code Online (Sandbox Code Playgroud)

factory dependency-injection circular-dependency swift

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

Swift如何检查API是否不可用

我将角半径应用于视图的左上角和右上角.在viewDidLoad()我有:

if #available(iOS 11.0, *) {
    view.layer.cornerRadius = 20.0
    view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
} 
Run Code Online (Sandbox Code Playgroud)

如果iOS 11不可用,最佳方式似乎就是这样做draw(_ rect:).由于我必须在外面覆盖它viewDidLoad(),我想做以下事情

if NOT #available(iOS 11.0, *) {
    override func draw(_ rect: CGRect) {
        let maskPath = UIBezierPath(roundedRect: self.contentView.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 20.0, height: 20.0))
        let shapeLayer = CAShapeLayer()
        shapeLayer.frame = self.bounds
        shapeLayer.path = maskPath.cgPath
        view.layer.mask = shapeLayer
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,它在语法上是不正确的.我该怎么办?

cornerradius ios swift4

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

找不到ViewModelProviders类,只能找到ViewModelProvider

我正在尝试创建生命周期感知的视图模型.但我只能ViewModelProviders在我的Android项目中找到课程ViewModelProvider.我似乎也没有android.arch.lifecycle.ViewModelProviders包导入.发生了什么

viewmodel kotlin

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

Kotlin:从末尾分割字符串

我想I_have_a_string分成I_have_astring

Kotlin 中是否有内置函数可以从末尾拆分?以下是我现在正在做的事情:

val words = myString.split("_")
val first = words.dropLast(1).joinToString("_")
val second = words.last()
Run Code Online (Sandbox Code Playgroud)

kotlin

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