2016-04-04 3 views
1

У меня есть окно документа, которое содержит ряд подклассов NSView, переключаемых между использованием элемента управления вкладкой. Каждый из подклассов и ViewController окна поддерживает различные действия пользователя, доступные через пункты меню, привязанные к первому ответчику.performSegueWithIdentifier из подкласса NSView?

Я хотел бы выполнить segue из одного из этих просмотров в ответ на пункт меню. Однако NSView не поддерживает performSegueWithIdentifier, это похоже на то, что является частью NSViewController.

Может кто-нибудь предложить способ обойти это? Я видел предложения передать VC во взгляды, но я не понимаю, как это сделать. Или, может быть, есть лучший способ?

+0

Поскольку '@ IBAction' подключены к первому ответчику, вы не смогли захватить действие в контроллере представления и выполнить действие, зависящее от активного вида. – vadian

+0

Да, но действие зависит от информации, закрытой для представления - в частности, для выбора в «NSTableView». Я мог бы разоблачить это, но это кажется неправильным. –

+0

Обычно вы * управляете * рабочим процессом из * control * ler, поскольку у вас есть доступ к представлениям. Альтернативой является использование шаблона протокола/делегата для отправки данных обратно контроллеру. – vadian

ответ

3
view.containingController.performSegue() 

Примечание: Вы должны добавить containingController своим видом

Я хотел бы добавить ViewController ответчику цепи, а затем сделать containingController вычисляемый свойство в расширении!

например. добавить vc в качестве ответчика:

override func awakeFromNib() { 
    super.awakeFromNib() 
    self.nextResponder = self.view 
    for subview in self.view.subviews { 
     subview.nextResponder = self 
    } 
} 

e.g. containingController в расширении

extension NSView { 

    var containingController: NSViewController? { 
     get { 
      while(self.nextResponder != nil) { 
       if(self.nextResponder is NSViewController) { 
        return self.nextResponder 
       }     
      } 
      return nil 
     } 
    } 
} 
+0

Примечание: расширение, записанное на память, может быть ошибкой или синтаксической ошибкой, но вы должны получить идею –

+0

Примечание: на самом деле это не путь. делегат будет чист IMO –

+0

Я все равно принимаю это, потому что потребовалось несколько секунд, чтобы реализовать и решить проблему. Да, я знаю, что я злоупотребляю системой, но иногда это меньше, чем чтение, а не «правильно». Это один из примеров. –

1

Вы можете сделать это (см ответа DAij-джан в), однако это не то, что я бы рекомендовал, так как гипотетический программист, который будет использовать ваш код, но не знаком с ним (давайте скажем, вы через год :)) может быть удивлен таким поведением.

Я бы порекомендовал вам добавить делегата (в соответствии с вашим пользовательским протоколом, назовем его MyViewDelegate) на ваш NSView с помощью метода, подобного viewRequiresToPerformTransition(view: YourViewSubclass). Затем вы реализуете этот метод (в более общем плане, вы соответствуете протоколу MyViewDelegate) в вашем контроллере просмотра и внутри его реализации выполняйте любой сегмент, который вы хотите.

+1

Я согласен на 100% с FreeNickname. Моя просто веселее: D –

+0

Хорошо, я понял, но как мне установить делегат в представлении? Я не хочу делать это во время пробуждения VC, потому что представления будут обновляться только тогда, когда они станут видимыми в представлении вкладки. –

+0

@MauryMarkowitz, если ваш контроллер представления содержится внутри 'UITabBarViewController', вы можете установить делегат в' viewWillAppear' (вложенного VC), например.Или в части кода, ответственного за показ представления, если он изначально скрыт. – FreeNickname

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