2014-11-16 6 views
1

Прямо сейчас я работаю над часовым приложением, которое позволяет пользователю пробивать в/из рабочего времени. Но мне трудно понять, как сделать эту функцию возможной.Разница во времени между нажатиями кнопок swift

В моей модели у меня есть:

struct TimeLog { 

var punchInTime: CFAbsoluteTime 
var punchOutTime: CFAbsoluteTime 
var timeWorked: Double 


init (pInTime: CFAbsoluteTime, pOutTime: CFAbsoluteTime) { 
    self.punchInTime = pInTime 
    self.punchOutTime = pOutTime 
    self.timeWorked = pOutTime - pInTime 
} 

} 

И в мой контроллер зрения:

class ViewController: UIViewController { 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func punchInButtonPressed(sender: AnyObject) { 

// not sure what actions are needed here to start the "aTimeLog" variable 

} 
@IBAction func punchOutButtonPressed(sender: AnyObject) { 

// not sure what actions are needed here to complete the "aTimeLog" variable 

} 

Я пытаюсь закончить эту переменную:

var aTimeLog = TimeLog(pInTime: //get the punch in time here, pOutTime: //get the punch out time here) 

И однажды переменной «aTimeLog» завершен (нажата кнопка punchOutButton). Я хочу отобразить журнал всех моих переменных «timeWorked».

Простите меня заранее. Вы могли бы сказать, что я просто изучаю программирование и Swift.

ответ

1

Лично я бы сохранил переменную в NSUserDefaults - сохраняя удар во времени. Затем, когда нажата кнопка punch out, она извлекает переменную dateTime из NSUserDefaults, выполняет ли необходимый расчет и возвращает результат. Это может случиться, если пользователь закрывает приложение (помните, что во время запомнилось пунш).

Это создает NSUserDefaults объект

var punchInTime : NSUserDefaults = NSUserDefaults.standardUserDefaults() 

    @IBAction func punchInButtonPressed(sender: AnyObject) { 

Сохраняет текущее время

 punchInTime.setObject(NSDate(), forKey: "punchInTime") 
     punchInTime.synchronize() 
    } 
    @IBAction func punchOutButtonPressed(sender: AnyObject) { 

извлекает сэкономленное время

 punchInTime.objectForKey("punchInTime") as NSDate 

создает переменную, содержащую текущее время, так что вы можете сравнить два

 var currentTime : NSDate = NSDate() 
     currentTime.timeIntervalSinceDate(punchInTime) // returns seconds 

Теперь вы можете сэкономить время начала, время окончания и общее время работы внутри, скажем, словарь с ключом в качестве даты, может быть ...

} 

Затем, когда вы хотите, чтобы отобразить все дней работал, просто пройдёмся по словарю :)

... надеюсь, я правильно понял

+0

, это имеет смысл, потому что я хочу, чтобы вовремя запомнилось, даже если приложение закрыто. Я ввел код, но я думаю, что я в замешательстве относительно того, как это работает, и я получаю неразрешенный идентификатор на «sliderTime» (не уверен, откуда это взялось), и он также говорит, что NSUserDefaults не конвертируется в NSDate. Кроме того, я смущен тем, как я могу хранить это в словаре. (Я хочу разрешить пользователю просматривать их в виде таблицы). ... Извините за мое невежество, я все равно хочу учиться. :) – Leighton

+0

Извините, что была моя ошибка ... исправлена. Код выше не будет работать из коробки, вам нужно будет исправить и поиграть с ним. Я сделал простой пример для вас на http://pastebin.com/Sv4pSyrA, но опять же, он решает только некоторые из ваших проблем. Единственный способ научиться - это выяснить это сами :) держитесь! –

+0

Возможно, я что-то пропустил, но не понимаю, как извлечь дату из функции timeIntervalSinceDate. – Leighton

0

Вы должны дать вашему классу ViewController ссылку ref на класс TimeLog (почему вы выбрали структуру? Работает тоже, но просто любопытно).

var timeLog: TimeLog? 

Во-вторых вы хотите инициализировать его свежим каждый раз, когда вы пробивать в

@IBAction func punchInButtonPressed(sender: AnyObject) { 
    let now = CFAbsoluteTimeGetCurrent() 
    self.timeLog = TimeLog(pInTime: now) 
} 

Таким образом, вы инициализируется только с pInTime, а остальная часть времени установлены на 0/ноль. Затем, когда вы ударяете, вы добавляете pOutTime, и вы можете рассчитать timeWorked.

@IBAction func punchOutButtonPressed(sender: AnyObject) { 
    if (self.timeLog == nil) { 
     return 
    } 

    self.timeLog!.punchOut(CFAbsoluteTimeGetCurrent()); 
    println(self.timeLog!.timeWorked) 
} 

Поскольку мы не используем конструктор, как вы создали его, и он нуждается в новой функции, мы должны изменить свой класс (класс использования, если вы не знаете, почему вы хотите-структуру).

class TimeLog { 

var punchInTime: CFAbsoluteTime 
var punchOutTime: CFAbsoluteTime 
var timeWorked: Double 


init (pInTime: CFAbsoluteTime) { 
    self.punchInTime = pInTime 
    self.punchOutTime = 0 
    self.timeWorked = 0 
} 

func punchOut(pOutTime: CFAbsoluteTime) { 
self.punchOutTime = pOutTime 
self.timeWorked = self.punchOutTime - self.punchInTime 
} 

} 
+0

когда я кладу в: self.timeLog = TimeLog (pInTime: сейчас) I получите отсутствующий аргумент для параметра «pOutTime» в punchInButtonPressed Action. – Leighton

+0

не знаю почему, но я все еще получаю кучу ошибок – Leighton

+0

Какие ошибки вы получаете? –

1

В качестве одного из возможных решений, вы можете изменить ваш метод инициализации следующим образом:

initWithStartTime (pInTime: CFAbsoluteTime) 
{ 
    self.punchInTime = pInTime 
} 

Затем добавить метод, как:

func workedTimeWithEndTime(pOutTime: CFAbsoluteTime) -> CFAbsoluteTime 
{ 
    return pOutTime - self.punchInTime 
} 

Наконец, вы, вероятно, захотите добавить "var timeLog: TimeLog!" в ваш контроллер просмотра и инициализируйте его в punchInButtonПредусмотренное время начала.

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