gpt4 book ai didi

swift - 如何使用 Swift 协议(protocol)函数作为 Android 接口(interface)监听器实现?

转载 作者:行者123 更新时间:2023-11-28 09:48:36 24 4
gpt4 key购买 nike

我是韩国 Android 开发人员,是 Swift 的新人。我正在将我的 android 应用程序迁移到 ios,但遇到界面和监听器问题。我不知道如何实现监听器以在自定义 View 和 View Controller 之间进行通信。

我有一个自定义 View (即 MyView),它有两个按钮,每个按钮都有自己的功能。在 Android(使用 Java)中,我通常在 MyView 中创建一个监听器接口(interface)并在其中分配两个函数,如 void func1(String val1) 和 func2...

public class MyView extends RelativeLayout {
private Button b1, b2;
private String val1, val2;

public interface OnButtonListener {
void onFunc1(String val1);

void onFunc2(String val2);
}

private OnButtonListener onButtonListener;

public void setOnButtonListener( OnButtonListener onButtonListener ) {
this.onButtonListener = onButtonListener;
}

public MyView( Context context, AttributeSet attrs ) {
super( context, attrs );
b1.setOnClickListener( view -> {
if (onButtonListener != null){
onButtonListener.onFunc1( val1 );
}
} );
b2.setOnClickListener( view -> {
if (onButtonListener != null){
onButtonListener.onFunc1( val2 );
}
} );
}
}

public class MyActivity extends Activity {
MyView myView1, myView2;

@Override
protected void onCreate( @Nullable Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
myView1.setOnButtonListener( new MyView.OnButtonListener() {
@Override
public void onFunc1( String val1 ) {
Log.d(TAG, val1);
}

@Override
public void onFunc2( String val2 ) {
Log.d(TAG, val2);
}
} );
myView2.setOnButtonListener( new MyView.OnButtonListener() {
@Override
public void onFunc1( String val1 ) {
// do something1
}

@Override
public void onFunc2( String val2 ) {
// do something2
}
} );
}
}

这段代码完全符合我的要求。所以我尝试将相同的模式应用到 Swift 中,但找不到任何方法。

下面是swift 4

import Foundation
import UIKit
import SnapKit

protocol OnButtonListener {
func onButton1( _ val1: String )
func onButton2( _ val2: String )
}

class MyView: UIView {
var onButtonListener: OnButtonListener?
var val1 = "abc"
var val2 = "123"

override init( frame: CGRect ) {
super.init( frame: frame )
let b1 = UIButton()
let b2 = UIButton() // i'm using snapkit
b1.addTarget(self, action: #selector(onB1), for: .touchUpInside)
b2.addTarget(self, action: #selector(onB2), for: .touchUpInside)
}

@objc func onB1() {
if onButtonListener != nil {
onButtonListener!.onButton1(val1 )
}
}

@objc func onB2() {
if onButtonListener != nil {
onButtonListener!.onButton2(val2 )
}
}
}

class MyVC : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let myView1 = MyView()
let myView2 = MyView()

myView1.onButtonListener = {
// ???
}
myView2.onButtonListener = {
// ???
}
}
}

我不知道如何在 ViewContorller 中实现监听器。我尝试过与 Kotlin 相同的方法,但我也没有工作。感谢您的阅读。

最佳答案

您必须在您的 View Controller 中设置委托(delegate)并在您的 View Controller 中实现协议(protocol)方法

class MyVC : UIViewController, OnButtonListener {
override func viewDidLoad() {
super.viewDidLoad()
let myView1 = MyView()
myView1. onButtonListener = self
let myView2 = MyView()
myView2. onButtonListener = self


}

func onButton1( _ val1: String ) {
print(val1)
}

func onButton2( _ val2: String ) {
print(val2)
}


}

**方法2:**你也可以使用block

class MyView: UIView { 
var buttonAction : ((_ value : String) -> Void)? = nil
//.... your code

@objc func onB1() {
if let action = buttonAction {
action("abc")
}
}

@objc func onB2() {
if let action = buttonAction {
action("xyz")
}
}

}

在你的 ViewController 中

  override func viewDidLoad() {
super.viewDidLoad()
let myView1 = MyView()
myView1.buttonAction = { value in
print(value)
}
}

关于swift - 如何使用 Swift 协议(protocol)函数作为 Android 接口(interface)监听器实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54140989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com