Swift addsubview и сбой приложения при возникновении IBAction

Я просто добавляю подвид из другого контроллера представления в мой текущий контроллер представления (который состоит из табличного представления). Я добавляю подвид, когда пользователь нажимает строку.

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, представление которых должно быть добавлено к моему текущему представлению. Когда я добавляю подвид с загрузкой nib, я получаю эту ошибку. Как мне поступить?

* Завершение работы приложения из-за необработанного исключения "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");
}


}

person Khant Thu Linn    schedule 26.07.2014    source источник
comment
Спасибо. Я перешел со SWIFT на Swift   -  person Khant Thu Linn    schedule 26.07.2014


Ответы (1)


Вы не должны этого делать. Это очень неправильная практика - добавлять представления других viewControllers в качестве подпредставлений. Каждый ViewController должен управлять своими собственными представлениями и своим собственным жизненным циклом.

Вы можете сделать это двумя способами:

1) Используйте Xib для представлений, которые вам нужны в обоих viewControllers, и загружайте 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
person codester    schedule 26.07.2014
comment
Спасибо. добавляю так. var nib:Array = NSBundle.mainBundle().loadNibNamed(alertVC, владелец: self, параметры: nil) var vc = nib[0] as? alertVC self.view.addSubview(vc?.view). Но я получил ошибку, как показано в моем вопросе (в редактировании). как мне поступить? - person Khant Thu Linn; 26.07.2014
comment
о.. я делаю неправильно. Мне это нравится. Тогда все в порядке. var vc = alertVC(nibName: alertVC, bundle: nil) vc.setUpData(Helper.Stored.alertViewWithPlacehlder) self.view.addSubview(vc.view). - person Khant Thu Linn; 26.07.2014
comment
В моем alertVC мне также нужно написать это. init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)} - person Khant Thu Linn; 26.07.2014
comment
отредактированный ответ: поместите alertVC (оно должно быть подклассом представления) в xib как класс и self.view.addSubview (vc). Ищите отредактированный ответ - person codester; 26.07.2014