2014-07-18 54 views
0

我正在创建一个可达性警报,我在Swift中编写并正在被最初写入目标C的应用程序中调用。我已正确设置了所有的桥接头-h。当我点击一个在Swift中创建的UIButton和一个也是用swift编写的IBAction时,问题就在发生。下面是错误和代码。有没有办法来防止这次崩溃?目标C中Swift UIButton和IBAction崩溃

终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因是: ' - [NSNotificationQueue buttonTapped:]:无法识别的选择发送到实例0x7ae602d0'

// NetworkErrorView.swift 


import Foundation 
import UIKit 



@objc class NetworkErrorView: NSObject { 

    var xCoordinate:CGFloat = 0 
    var yCoordinate: CGFloat = 0 
    var width: CGFloat = 0 
    var height: CGFloat = 0 
    var reTryButton = UIButton() 


func renderAlertView() -> UIView { 

    let alert = UIAlertView() 
    alert.title = "Connection Failed" 
    alert.message = "Your device is not connected to the Internet. Please try again later." 
    alert.addButtonWithTitle("OK") 
    alert.show() 
    return alert 

    } 


func renderReTryButton() -> UIView { 

    var buttonImage = UIImage(named: "[email protected]") 
    reTryButton.addTarget(self, action: Selector("buttonTapped:"), forControlEvents: UIControlEvents.TouchUpInside) 
    reTryButton.setBackgroundImage(buttonImage, forState: UIControlState.Normal) 
    reTryButton.frame = CGRect(x: 18, y: 470, width: 290, height: 30) 
    println("stopes here") 
    return reTryButton 

    } 


    @IBAction func buttonTapped (sender: AnyObject!) { 

    let alertView = UIAlertView() 
    alertView.title = "Connection Failed" 
    alertView.message = "Your device is not connected to the Internet. Please try again later." 
    alertView.addButtonWithTitle("OK") 
    alertView.show() 

    } 

func render() -> UIView { 

    var networkErrorView = UIView() 

    let screenSize: CGRect = UIScreen.mainScreen().bounds 

    let screenWidth = screenSize.width; 

    let screenHeight = screenSize.height; 

if screenHeight == 480 { 

    xCoordinate = 0 

    yCoordinate = 74 

    width = 320 

    height = 361 

    var imgNoConnection = UIImage(named: "Noconnectionz.png") 
    networkErrorView = UIImageView(image: imgNoConnection) 

    } 

else if screenHeight == 568 { 

    xCoordinate = 0 

    yCoordinate = 74 

    width = 320 

    height = 443 

    var imgNoConnection = UIImage(named: "[email protected]") 
    networkErrorView = UIImageView(image: imgNoConnection) 

    } 

    return networkErrorView 

} 

}

这里是我称之为目标C

Swift *connectivity = [[Swift alloc]init]; 
bool swiftConnected = [connectivity reachability]; 

if (!swiftConnected) { 
    NetworkErrorView *networkErrorView = [[NetworkErrorView alloc]init]; 
    [networkErrorView renderAlertView]; 
    UIView *subView = [networkErrorView render]; 
    [super.view addSubview: subView]; 
    [super.view addSubview:[networkErrorView renderReTryButton]]; 

    } 
    } 
+0

尝试anyObject而不展开它? @IBAction func buttonTapped(sender:AnyObject) – domshyra

+0

我试过了,我试过让它成为UIButton的发件人。 – ArmorKing1212

+0

当我拿出这行代码:reTryButton.addTarget(self,action:Selector(“buttonTapped:”),forControlEvents:UIControlEvents.TouchUpInside)我可以单击按钮而不会崩溃,但我显然需要分配给按钮。我想知道其他人是否有这个问题。我正在使用xcode6 beta 3. – ArmorKing1212

回答

0

这是你的问题:

[networkErrorView renderAlertView]; 
UIView *subView = [networkErrorView render]; 

您的功能renderAlertView没有任何副作用,也就是说,它只是创建一个UIView并将其返还给您。但即使它没有副作用,你仍然在调用它而没有将它分配给某些东西。

我不太知道什么render呢(请告诉我们的代码!),但我的猜测是,它不返回任何东西,它只是呈现networkErrorView,但你作为一个UIView分配它。所以,我想你想要更类似这样的东西:

UIView *subView = [networkErrorView renderAlertView]; 
[subView render]; 
+0

我将渲染代码添加到了我的问题中。当没有互联网连接时,渲染函数会创建一个带覆盖图像的UIView和一个UIAlert,告诉用户没有互联网,同样在视图中呈现的按钮是一个重试按钮,用于再次检查连接。问题在于它是自己的按钮。当我添加代码来运行IBAction函数时,应用程序崩溃并给出错误消息。 – ArmorKing1212

+0

@ ArmorKing1212嗯......我不知道那是什么问题。我可以告诉你的是'[NSNotificationQueue buttonTapped]'意味着'NSNotificationQueue'的一个实例以某种方式得到'buttonTapped'方法,而应该是一个按钮。你能告诉我们完整的崩溃日志吗? –