2016-06-30 3 views
1

У меня есть NSTitlebarAccessoryViewController с неопределенным NSProgressIndicator в нем. Я хочу, чтобы иметь возможность запускать и останавливать его из разных мест в моем приложении, иногда за пределами контроллера вида.Как активировать счетчик в контроллере просмотра заголовка аксессуаров другого класса?

Я довольно новичок в разработке OS X. Я слышал, что в OS X цепочка ответчиков больше используется, чем в iOS. Я заглянул в цепочку респондеров и как это сделать через NSResponder, но я действительно не могу этого толковать. Ниже приведен снимок экрана для визуализации.

enter image description here

Вот код для моего строки заголовка в соотв. Контроллер вида:

class TitleBarAccessoryViewController: NSTitlebarAccessoryViewController, TitleBarActionable { 

@IBOutlet var loadingSpinner: NSProgressIndicator! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do view setup here. 
} 
func loadingSpinnerShouldBecomeActive(activate: Bool) { 
    print("Hello") 
    loadingSpinner.hidden = !activate 
    if activate { 
     loadingSpinner.startAnimation(self) 
    } else { 
     loadingSpinner.stopAnimation(self) 
    } 
    } 
} 

я тогда хочу называть это через расширение протокола:

extension EmployeeAPI { 

    func getAllEmployees(completionHandler: ([FDataSnapshot]) -> Void) { 
     let employeeRef = ref.childByAppendingPath("employees") 
     //Somehow start the loading indicator here 

     employeeRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 
      //And somehow stop it here 
      var arr: [FDataSnapshot] = [] 
      for snap in snapshot.children { 
       if let snap = snap as? FDataSnapshot { 
        arr.append(snap) 
       } 
      } 
      completionHandler(arr) 
     }) 

Я также ищу, чтобы начать и остановить его от различных viewControllers, поэтому он не ограничивается протокол расширения.

+0

Я видел, что NSNotificationCenter довольно распространен в этом случае. Просто создайте собственное событие и вызовите его в TitleBarAccessoriyViewController. Однако, если у вас есть такие ситуации, лучше еще раз взглянуть на архитектуру приложения и использовать что-то вроде шаблона Application Controller или шаблона VIPER для создания сложного приложения. Архитектура Massive View Controller может быть не лучшим выбором для таких приложений. –

ответ

0

Простым решением, которое является развязанным, является использование NSNotification, например. «TitleBarAccessoryViewStartSpinnerNotification» и «TitleBarAccessoryViewStopSpinnerNotification».

1

Немного, кроме вашего вопроса - но Ответчик цепи является очень распространенным design pattern, и если вы планируете остаться в разработке программного обеспечения это абсолютно стоит прочитать:

+0

Спасибо Джей. Я посмотрю, что – Chris

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

  • Нет связанных вопросов^_^