当IBAction发生时,Swift会添加子视图和应用程序崩溃

时间:2014-07-26 09:49:27

标签: ios swift tableview ibaction

我只是将其他视图控制器的子视图添加到我当前的视图控制器(由tableview组成)。我在用户按行时添加子视图。

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!)
{
    var vc: alertVC = alertVC()
    vc.setUpData(Helper.Stored.alertViewWithPlacehlder)
    self.view.addSubview(vc.view)
}

之后,在那个alertVC中,有IBAction。当我按下那个按钮时,我的应用程序粉碎了。我也不知道为什么。我该怎么办?调试中也没有显示任何内容。

@IBAction func cancel(sender: AnyObject)
{
    NSLog("cancel");
}

编辑:以下是我在alertVC中的代码,该视图将添加到我当前的视图中。当我使用加载笔尖添加子视图时,我收到此错误。我该怎么办?

* 由于未捕获的异常终止应用' NSUnknownKeyException',原因:' [< _TtC13FastPhoneCard9ContactVC 0x17d53110> setValue:forUndefinedKey:]:此类与密钥vwTwoBtnWithTitle不符合密钥值编码。'

import UIKit

class alertVC: UIViewController {

var alertType: NSString = NSString()

@IBOutlet var vwTwoBtnWithTitle: UIView


override func viewDidLoad() {
    super.viewDidLoad()
    setUpInterface()
    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

class func getView() -> alertVC {
    return NSBundle.mainBundle().loadNibNamed("alertVC", owner: nil, options: nil)[0] as alertVC
}

func setUpInterface()
{
    self.view.backgroundColor = UIColor (white: 1, alpha: 0.5)
    if(alertType == Helper.Stored.alertViewWithPlacehlder)
    {
        addVWTwoBtnWithTitle()
    }
}

func setUpData(input : NSString)
{
    alertType = input
}

func addVWTwoBtnWithTitle()
{
    vwTwoBtnWithTitle.frame = CGRectMake(20, 190, 280, 160);
    vwTwoBtnWithTitle.layer.borderWidth = 1
    vwTwoBtnWithTitle.layer.borderColor = UIColor.blackColor().CGColor
    vwTwoBtnWithTitle.layer.cornerRadius = 5
    self.view.addSubview(vwTwoBtnWithTitle)
}


@IBAction func cancel(sender: AnyObject)
{
    NSLog("cancel");
}


}

1 个答案:

答案 0 :(得分:4)

你不应该这样做。将其他viewControllers的视图添加为subView是非常错误的做法。每个ViewController都应该管理自己的视图和自己的LifeCycle。

有两种方法可以做:

1)在两个viewControllers中使用Xib视图,并加载xib所需的视图。使用properties和委托来回传递数据。

2)使用ViewController Containers。更适合使用viewControllers,他们可以很好地管理和构建代码。

每个viewController都应该管理自己的视图,如果你需要另一个viewController,你应该呈现或导航ViewController,如果这是相关的。每个ViewController都有自己的生命周期。

对于Xib

创建新的Xib并创建新的file,它是您案例AlertView中视图的子类 加载视图 重要:转到xib - >身份检查员 - >自定义类部分,并将Class设为AlertView

     var nib:Array = NSBundle.mainBundle().loadNibNamed("View", owner: self, options: nil) //View is name of  xib 
      var view = nib[0] as? AlertView
     self.view.addSubview(view)  //this will add subview of current viewController