2017-10-30 4 views
-2

Ich verwendete OC, um eine Werkzeugklasse anzupassen, ein Knopfwerkzeug zu erstellen, wie man dieses Werkzeug in schnellen Code umwandelt? In Zeile _buttonBlock = [button copy]; Wie kopiert man Benutzer in swift?Wie OC in Swift4 unter Code konvertieren?

ToolView .h

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface ToolView : NSObject 

+ (instancetype)shendInstance; 

- (void)createButtonWithFrame:(CGRect)rect superView:(UIView *)superView buttonBlock:(void(^)(UIButton *button))button; 

@end 

ToolView.m

#import "ToolView.h" 

typedef void(^ButtonBlock)(); 

@interface ToolView(){ 
    ButtonBlock _buttonBlock; 
} 

@end 

@implementation ToolView 

+ (instancetype)shendInstance{ 
    static ToolView *toolview = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     toolview = [[ToolView alloc]init]; 
    }); 
    return toolview; 
} 

- (void)createButtonWithFrame:(CGRect)rect superView:(UIView *)superView buttonBlock:(void(^)(UIButton *button))button{ 
    _buttonBlock = [button copy]; 
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    btn.frame = rect; 
    btn.backgroundColor = [UIColor orangeColor]; 
    [btn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; 
    [superView addSubview:btn]; 
} 

- (void)buttonAction:(UIButton *)sender{ 
    if (_buttonBlock) { 
     _buttonBlock(sender); 
    } 
} 

@end 

Antwort

0

In Zeile _buttonBlock = [Taste Kopie]; Wie kopiert man Benutzer in swift?

Sie den Block-Parameter in Swift nicht kopieren, anstatt Sie den Parameter als Flucht markieren. Sie Swift-Funktion wird so etwas wie deklariert werden:

fun createButton(frame: CGRect, 
       superView: UIView, 
       buttonBlock: @escaping (UIButton) -> Void 
       ) 

Siehe Escaping Closures im The Swift Programming Language: Closures.

+0

'buttonBlock' ist Taste Selektor Rückruf, nicht UIButton, wie fix zu? –

+0

Indem Sie den Blockparameter als escaping deklarieren, können Sie ihn Ihrer Instanzvariablen zuweisen. Dies ist in * EscapingClosures * enthalten. Verkenne ich, was du fragst? – CRD

-1

ich konvertiert es, selbst Code unten:

ToolView.swift

import UIKit 
class ToolView: NSObject { 

    static let instance: ToolView = ToolView() 
    class func shareInstance() -> ToolView{ 
     return instance 
    } 

    var blockActionBlock:((UIButton) -> Void)? 

    func createButton(frame: CGRect, superView: UIView, buttonBlock: @escaping (UIButton) ->Void) -> Void { // 
     let button = UIButton() 
     button.frame = frame 
     button.backgroundColor = UIColor.red 
     superView .addSubview(button) 
     button .addTarget(self, action: #selector(self.buttonAction), for: UIControlEvents.touchUpInside) 
     blockActionBlock = buttonBlock 
    } 

    @objc func buttonAction(sender: UIButton){ 
     blockActionBlock!(sender) 
    } 
} 

ViewController.swift

import UIKit 
class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     ToolView .shareInstance().createButton(frame: CGRect(x:100, y: 100, width:100, height:50), superView: self.view) { (button) in 
      print("Click Button \(button)") 
     } 
    } 
} 
Verwandte Themen