2015-09-10 5 views
1

Я довольно новичок в программировании на ios, и я не уверен, что лучший способ сделать это. Я хочу создать делегатский протокол, который может быть использован для уведомления заинтересованных наблюдателей (в частности, для двух диспетчеров контекста) изменения состояния изображения в состоянии. Я хочу, чтобы каждый контроллер представления соответствовал ему. например, если он находится в состоянии 1, то он появляется только в первом диспетчере представлений и, если он находится в состоянии 2, то он появляется только во втором диспетчере представлений.
это то, что я до сих пор:Протокол делегата для двух диспетчеров просмотра

protocol imgState { 

    static var state1 : Int {get set} 
    static var state2 : Int {get set} 


func stateChange(){ 

if state1 == 1 { 

    set { 
      state1 == 0 
      state2 == 1 

     } 

    } 
if state2 == 1 { 

    set { 
     state1 == 1 
     state2 == 0 

} 
    } 

} 
} 

мое мышление, чтобы вызвать функцию в каждом ViewController, когда кнопка нажата, чтобы изменить состояние.

Есть ли хорошие учебники, на которые кто-то мог бы направить меня или какие-либо рекомендации о том, как начать вообще? все должно помочь.

ответ

0

Одна идея состоит в том, чтобы использовать Observable/Subject класс (как этот, что я писал:. https://gist.github.com/dtartaglia/0a71423c578f2bf3b15c, но есть много библиотек, которые обеспечивают это и другие, услуг)

С этой услугой, вы бы обернуть изображение в объекте Subject и два контроллера представления будут attach блок кода для объекта. Затем всякий раз, когда сведенное изображение изменяется (назначая mySubject.value), будут вызваны подключенные блоки.

Только обязательно, чтобы dispose наблюдателей были сделаны.

1

Я использовал делегатов в прошлом, но я предпочитаю размещать уведомление. В вашем примере, при нажатии на кнопку, вы можете сделать что-то вроде этого,

NSNotificationCenter.defaultCenter().postNotificationName("buttonPressed", object: nil) 

Другие мнения будут слушать для этого уведомления с:

// Usually added to viewDidLoad()  
NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateState", name: "buttonPressed", object: nil)  

Вы бы тогда имеют функ названный " updateState "в соответствующих контроллерах представлений, которые будут вызываться всякий раз, когда будет отправлено уведомление« buttonPressed ».

Надеюсь, это поможет.

1

Вы можете добиться этого гораздо проще, используя NSNotifications ... То, как вы это сделаете, поскольку вы пытаетесь прослушивать 2 разных входа/действия, состоит в том, чтобы публиковать уведомление для каждого ... ответит сразу!

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

var var1:Bool = false // setting a false value as a default 


@IBAction func expectAction(sender:AnyObject) { 
    if var1 == false { 
     NSNotificationCenter.defaultCenter().postNotificationName("key1", object: nil) 
    } else { 
     NSNotificationCenter.defaultCenter().postNotificatioinName("key2", object: nil) 
    } 

} 

Тогда на каждом из классов, которые вы бы добавить наблюдателей в ответ на такие уведомления следующим образом: (при условии, ViewController1 является слушателем 1 и ViewController2 является слушателем 2)

В вашем методе viewDidLoad() в ViewController1 добавить следующее:

NSNotificationCenter.defaultCenter().addObserver(self, selector:"actonKey1:", name:"key1", object: nil) 

Затем добавьте новый метод в ViewController1

@obj private func actonKey1(notification: NSNotification) { 
    // do your work here 
} 

Наконец (для этого ViewController1) добавить метод deinitializing так:

deinit{ 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

Вы повторить это для ViewController2 изменив соответствующие имена ключом1 к Клавишу2

В вашем viewDidLoad() метод в ViewController2 добавить следующее:

NSNotificationCenter.defaultCenter().addObserver(self, selector:"actonKey2:", name:"key2", object: nil) 

Затем добавьте новый метод в ViewController2

@obj private func actonKey2(notification: NSNotification) { 
    // do your work here 
} 

Наконец (для этого ViewController2) добавить метод deinitializing так:

deinit{ 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

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

Cheers

+0

ОК сделал все, что вы сказали. но im все еще не уверен, как сообщить viewcontroller, показывать или не отображать каждое изображение. – user3462448

+0

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

+0

ладно спасибо! – user3462448