如何使用 Swift 协议功能作为 Android 接口侦听器实现?

用户3114247

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

我有一个自定义视图(即 MyView),它有两个按钮,每个按钮都有自己的功能。在Android(使用Java)中,我通常在MyView 中创建一个侦听器接口并在内部分配两个函数,例如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 相同的方法,但我也没有工作。感谢您的阅读。

普拉提克·普拉贾帕蒂

您必须在视图控制器中设置委托并在视图控制器中实现协议方法

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:** 你也可以使用块

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)
       } 
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在片段中实现侦听器接口?

来自分类Dev

使用Android内置的手势侦听器和缩放侦听器实现捏缩放和拖动

来自分类Dev

如何在Android中将接口用作响应侦听器?

来自分类Dev

Android RecyclerView如何设置单击侦听器-将类转换为接口

来自分类Dev

android侦听器接口变量null

来自分类Dev

为什么Android Studio中的侦听器接口的默认实现包含可为空的父级?

来自分类Dev

Android侦听器/回调如何?

来自分类Dev

Android侦听器/回调如何?

来自分类Dev

如何在Android中将onclick和ontouch侦听器都用于不同的功能

来自分类Dev

Android Studio在使用if else将侦听器置于通知功能中时出错

来自分类Dev

如何实现onchildclick侦听器?

来自分类Dev

Swift:如何实现协议(接口)的部分类实现?

来自分类Dev

Swift:如何实现协议(接口)的部分类实现?

来自分类Dev

Swift协议可选函数中如何使用枚举作为参数

来自分类Dev

android自定义侦听器-如何注销

来自分类Dev

如何在Android的Firebase中跟踪侦听器?

来自分类Dev

Android:如何为Acivity.onNewIntent()设置侦听器?

来自分类Dev

如何在RadioButton中设置侦听器-Android

来自分类Dev

为什么在Android侦听器上使用WeakReference?

来自分类Dev

Scrollview侦听器无法在Android的Xamarin中使用?

来自分类Dev

在 android 应用程序关闭后使用侦听器

来自分类Dev

Android cardview,使用开关侦听器更改背景颜色

来自分类Dev

如何实现Swift的Comparable协议?

来自分类Dev

如何删除清理功能上的侦听器

来自分类Dev

如何从 Shopware 的侦听器更改核心功能的返回

来自分类Dev

如何在XML中实现OnTouch侦听器

来自分类Dev

如何实现类/数据库侦听器?

来自分类Dev

实现时如何修复文本更改侦听器错误?

来自分类Dev

使用Java实现工作站锁定侦听器

Related 相关文章

  1. 1

    如何在片段中实现侦听器接口?

  2. 2

    使用Android内置的手势侦听器和缩放侦听器实现捏缩放和拖动

  3. 3

    如何在Android中将接口用作响应侦听器?

  4. 4

    Android RecyclerView如何设置单击侦听器-将类转换为接口

  5. 5

    android侦听器接口变量null

  6. 6

    为什么Android Studio中的侦听器接口的默认实现包含可为空的父级?

  7. 7

    Android侦听器/回调如何?

  8. 8

    Android侦听器/回调如何?

  9. 9

    如何在Android中将onclick和ontouch侦听器都用于不同的功能

  10. 10

    Android Studio在使用if else将侦听器置于通知功能中时出错

  11. 11

    如何实现onchildclick侦听器?

  12. 12

    Swift:如何实现协议(接口)的部分类实现?

  13. 13

    Swift:如何实现协议(接口)的部分类实现?

  14. 14

    Swift协议可选函数中如何使用枚举作为参数

  15. 15

    android自定义侦听器-如何注销

  16. 16

    如何在Android的Firebase中跟踪侦听器?

  17. 17

    Android:如何为Acivity.onNewIntent()设置侦听器?

  18. 18

    如何在RadioButton中设置侦听器-Android

  19. 19

    为什么在Android侦听器上使用WeakReference?

  20. 20

    Scrollview侦听器无法在Android的Xamarin中使用?

  21. 21

    在 android 应用程序关闭后使用侦听器

  22. 22

    Android cardview,使用开关侦听器更改背景颜色

  23. 23

    如何实现Swift的Comparable协议?

  24. 24

    如何删除清理功能上的侦听器

  25. 25

    如何从 Shopware 的侦听器更改核心功能的返回

  26. 26

    如何在XML中实现OnTouch侦听器

  27. 27

    如何实现类/数据库侦听器?

  28. 28

    实现时如何修复文本更改侦听器错误?

  29. 29

    使用Java实现工作站锁定侦听器

热门标签

归档