Swift 中自定义函数内的按钮操作

Posted

技术标签:

【中文标题】Swift 中自定义函数内的按钮操作【英文标题】:Button action inside custom function in Swift 【发布时间】:2015-12-29 12:02:53 【问题描述】:

我不想在每个 UIViewController swift 文件中使用相同的代码,所以我创建了一个自定义函数:

import Foundation;
import UIKit;

func noSignal(view : UIView) -> UIView 

    let noConnectionView = UIView(frame: CGRectMake(100, 200, 260, 200));
    noConnectionView.backgroundColor = UIColor.whiteColor();
    noConnectionView.layer.cornerRadius = 10;
    noConnectionView.layer.shadowColor = UIColor.blackColor().CGColor;
    noConnectionView.layer.shadowRadius = 8;
    noConnectionView.layer.shadowOpacity = 0.3;
    noConnectionView.layer.shadowOffset = CGSizeMake(0, 0);
    noConnectionView.center = view.center;

    let heading = UILabel(frame: CGRectMake(10,40,240,20));
    heading.textColor = UIColor.lightGrayColor();
    heading.textAlignment = NSTextAlignment.Center;
    heading.text = "NO CONNECTION";
    noConnectionView.addSubview(heading);

    let message = UITextView(frame: CGRectMake(10,80,240,60));
    message.textColor = UIColor.lightGrayColor();
    message.textAlignment = NSTextAlignment.Left;
    message.text = "Please enable internet connection in your device (WiFi or Mobile) and tap retry.";
    noConnectionView.addSubview(message);

    let retry = UIButton(frame: CGRectMake(60,140,140,40));
    retry.setTitle("Retry", forState: UIControlState.Normal);
    retry.layer.cornerRadius = 6;
    retry.backgroundColor = UIColor(netHex: 0xF91A6E);
    retry.setTitleColor(UIColor.whiteColor(), forState: .Normal);
    retry.addTarget(self, action: "retryConnection:", forControlEvents: UIControlEvents.TouchUpInside);

    noConnectionView.addSubview(retry);
    view.addSubview(noConnectionView);


    return noConnectionView;


在我看到的所有示例中,addTarget 都应该引用 self,但是当我这样做时,Xcode 显示使用 uf 未解析的标识符“self”,所以我尝试使用 view 然后它编译。但是当我点击重试按钮时它崩溃了。

所以我的问题是,我应该将“retryConnection”函数放在哪里,应该放在 noSignal 函数内,还是放在其他地方?该函数在 UIWebView webViewDidStartLoad 中运行。

【问题讨论】:

在您的 noSignal 函数所在的同一类中。 【参考方案1】:

请尝试使用您要添加该视图的传递视图控制器并将目标更改为该视图控制器而不是自我

    func noSignal(view : UIView , viewController : UIViewController) -> UIView 

    let noConnectionView = UIView(frame: CGRectMake(100, 200, 260, 200));
    noConnectionView.backgroundColor = UIColor.whiteColor();
    noConnectionView.layer.cornerRadius = 10;
    noConnectionView.layer.shadowColor = UIColor.blackColor().CGColor;
    noConnectionView.layer.shadowRadius = 8;
    noConnectionView.layer.shadowOpacity = 0.3;
    noConnectionView.layer.shadowOffset = CGSizeMake(0, 0);
    noConnectionView.center = view.center;

    let heading = UILabel(frame: CGRectMake(10,40,240,20));
    heading.textColor = UIColor.lightGrayColor();
    heading.textAlignment = NSTextAlignment.Center;
    heading.text = "NO CONNECTION";
    noConnectionView.addSubview(heading);

    let message = UITextView(frame: CGRectMake(10,80,240,60));
    message.textColor = UIColor.lightGrayColor();
    message.textAlignment = NSTextAlignment.Left;
    message.text = "Please enable internet connection in your device (WiFi or Mobile) and tap retry.";
    noConnectionView.addSubview(message);

    let retry = UIButton(frame: CGRectMake(60,140,140,40));
    retry.setTitle("Retry", forState: UIControlState.Normal);
    retry.layer.cornerRadius = 6;
 //   retry.backgroundColor = UIColor(netHex: 0xF91A6E);
    retry.setTitleColor(UIColor.whiteColor(), forState: .Normal);
    retry.addTarget(viewController, action: "retryConnection:", forControlEvents: UIControlEvents.TouchUpInside);

    noConnectionView.addSubview(retry);
    view.addSubview(noConnectionView);


    return noConnectionView;


【讨论】:

我这样做了。但是我应该在哪里放置 retryConnection 函数?我已经在该函数和视图控制器中尝试过,但是当我点击按钮时,它会抛出:无法识别的选择器发送到实例错误 你必须把重试连接放在你传入方法的那个viewcontrollr中 不幸的是,无论我把它放在哪里,它都会抛出同样的错误。现在我尝试在 viewDidLoad 中初始化 noSignal 函数,但没有任何帮助。消息完美弹出,但点击该按钮仍会使我的应用崩溃。 它成功了,我所要做的就是删除冒号:"retryConnection"

以上是关于Swift 中自定义函数内的按钮操作的主要内容,如果未能解决你的问题,请参考以下文章

Swift之使用KeyPaths创建自定义查询函数

我们可以在 BigQuery 中自定义函数吗?如何在 BigQuery 中创建日期参数?

在 Swift 2.0 中自定义 UIButton 外观

在按钮中自定义 bootstrap 5 文本颜色对比度

C语言怎么自定义MessageBox函数的按钮?要新窗口吗?

在mysql中自定义的函数怎么调用