2015-04-20 5 views
0

Я пытаюсь сохранить NSTimer в модели своего приложения и обновить время в файле контроллера View. Для этого я создал эти два метода:Swift: использование селекторов с несколькими аргументами

func startTimer(labelToUpdate : UILabel) { 
    timerGoing = true 
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "decTimeByOne:labelToUpdate:", userInfo: labelToUpdate, repeats: true) 
} 

func decTimeByOne(labelToUpdate : UILabel) { 
     if timerGoing { 
      if decreasingTime > 0 { 
       decreasingTime--; 
       labelToUpdate.text = "\(decreasingTime)" 
      } 
      else { 
       timerGoing = false 
       timer.invalidate() 
      } 
     } 
    } 

я получаю исключение во время выполнения (я считаю) в консоли, что есть «Непризнанный селектор». После некоторого исследования у меня сложилось впечатление, что это был синтаксис, используемый в Swift для вызова нескольких методов аргументов в селекторах: selector: «methodName: argumentName:», userInfo: argumentPassedIn,

В конце концов, я хотел бы сохранить таймер, связанный с объектом моей модели, и просто обновить это время и отобразить его в представлении приложений. Правильно ли это происходит?

+0

Ваша функция не является функцией с несколькими аргументами. Правильный селектор - это просто «decTimeByOne:» – ad121

ответ

-3

Хранить все в массиве и передавать его в userInfo. Тогда вы можете пройти все, что захотите.

func startTimer(labelToUpdate : UILabel) { 
    var array = [labelToUpdate, otherStuff] 

    timerGoing = true 
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "decTimeByOne:", userInfo: array, repeats: true) 
} 

func decTimeByOne(labelToUpdate : UILabel) { 
    var array = labelToUpdate.userInfo 
     if timerGoing { 
      if decreasingTime > 0 { 
       decreasingTime--; 
       labelToUpdate.text = "\(decreasingTime)" 
      } 
      else { 
       timerGoing = false 
       timer.invalidate() 
      } 
     } 
    } 
2

Я был под впечатлением, что это синтаксис, используемый в Swift вызвать несколько методов аргументов в селекторах: `селектор:«имяМетод: Имя_аргумент»

В некотором смысле это правда , но это не освобождает вас от ответственности, если вы собираетесь использовать NSTimer, чтобы прочитать документы на NSTimer. В частности, это не меняет того факта, что селектор, вызываемый NSTimer, равен , а не до вас. Он может быть только methodName:, потому что он принимает только один параметр - таймер (не ярлык или что-то еще). Как вам уже сказали, если у вас есть другая информация для передачи, приложите к в таймер, который будет передан.

Теперь в дополнение, вы также неправильно о том, как указать название вашего метода. Селектором для метода, объявленного как func decTimeByOne(labelToUpdate : UILabel, является decTimeByOne:. Опять же, это не зависит от вас; вы должны знать правила, как сделать селектор.

+0

И вот эти правила: http://www.apeth.com/swiftBook/apa.html#_selectors – matt

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