我正在尝试向 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) 首先让我开始展示代码:
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) 我的顶级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) 我有类型的输入数据 List<UnitWithComponents>
class UnitWithComponents {
var unit: Unit? = null
var components: List<Component> = ArrayList()
}
Run Code Online (Sandbox Code Playgroud)
我想将数据转换vararg为Unit
目前我正在做*data.map { it.unit!! }.toTypedArray()。有更好的方法吗?
我正在使用UIViewControllerAnimatedTransitioning并UIPercentDrivenInteractiveTransition以交互方式关闭一个模态呈现的视图控制器.没什么太花哨的.但我注意到,当交互开始时偶尔会出现一个小问题.如果使用.curveEaseOut选项进行动画制作会变得更加明显.我正在关注的一些在线教程(https://www.thorntech.com/2016/02/ios-tutorial-close-modal-dragging/)也会发生同样的事情.当我第一次将它向下拖动时,你可以看到gif中的故障.有什么建议?
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) 我正在为我的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) 我正在关注 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) 我将角半径应用于视图的左上角和右上角.在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)
当然,它在语法上是不正确的.我该怎么办?
我正在尝试创建生命周期感知的视图模型.但我只能ViewModelProviders在我的Android项目中找到课程ViewModelProvider.我似乎也没有android.arch.lifecycle.ViewModelProviders包导入.发生了什么
我想I_have_a_string分成I_have_a和string。
Kotlin 中是否有内置函数可以从末尾拆分?以下是我现在正在做的事情:
val words = myString.split("_")
val first = words.dropLast(1).joinToString("_")
val second = words.last()
Run Code Online (Sandbox Code Playgroud) kotlin ×5
swift ×3
ios ×2
android ×1
android-room ×1
async-await ×1
cornerradius ×1
enums ×1
factory ×1
interactive ×1
java ×1
list ×1
observable ×1
swift4 ×1
viewmodel ×1