2017-02-21 7 views
0

Я хочу использовать NSStackView для представления стека друг над другом, я также хочу, чтобы они могли расширяться, поэтому я не могу использовать NSCollectionView, если я правильно понял. Так, в раскадровке, я создал NSStackView (встроенный в целях прокрутки) в главном контроллере представления и контроллер представления, что я хочу, чтобы заполнить его:Добавление представлений с IBAction в приложение NSStackView сбой

storyboard

Кнопка будет заполнить стек смотреть с десятью видами:

@IBOutlet weak var stackView: NSStackView! 

@IBAction func redrawStackView(_ sender: Any) { 
    for i in 0..<10 { 
     let stackViewItemVC = storyboard?.instantiateController(withIdentifier: "StackViewItemVC") as! StackViewItemViewController 
     stackViewItemVC.id = i 
     stackView.addArrangedSubview(stackViewItemVC.view) 
    } 
} 

И ViewController на право просто выглядит следующим образом:

class StackViewItemViewController: NSViewController { 
var id: Int = -1 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do view setup here. 
} 

@IBAction func buttonPressed(_ sender: Any) { 
    debugPrint("StackViewItemViewController" + id.description + "pressed") 
} 

Running это небольшое приложение работает отлично, каждый раз, когда я нажимаю кнопку, появляется еще десять элементов представления стека. Но, когда у меня есть наглость, чтобы нажать одну из кнопок справа сбои приложения:

crash situation

Где я буду неправильно? Я попытался обойти IBAction, чтобы убедиться, что это то, что ломается, и приложение не будет разбиваться, если я подклассифицирую кнопку и создаю протокол «buttonDelegate» с функцией, вызываемой из mouseUp.

+0

У вас нет StackTrace в отладчик/консоли? – Larme

+0

Нет, не производится. Его действительно странно, обычно «Текущая трассировка стека»: в правой колонке. Но теперь его пустым, за исключением синего (lldb) –

ответ

1

Я думаю, проблема в том, что объекты viewController, которые вы создаете в цикле, немедленно освобождаются.

Несмотря на то, что вид прикреплен к stackView, его уничтожает viewController.

Вы можете исправить эту проблему, сохранив ссылку на каждый viewController.

Вы можете сделать это, создав новую переменную

var itemViewControllers = [StackViewItemViewController]() 

, а затем добавьте каждый вновь созданный ViewController к нему:

itemViewController.append(stackViewItemVC) 
+1

Это сделало трюк! Бесконечно благодарен. Я думал, что ссылка с кнопки с действием была установлена ​​автоматически из раскадровки, но я думаю, что это происходит поздно ... –

+0

Рад, что я был в состоянии помочь вам! Не возражаете ли вы принять ответ? – mangerlahn

Смежные вопросы