Как получить NSDate из целого числа, переданного в as и id? - PullRequest
2 голосов
/ 10 января 2011

Это сводит меня с ума, поэтому я надеюсь, что кто-то может помочь новичку Objective-C понять это. Вот сделка:

Я занимаюсь разработкой приложения для iPhone с использованием Titanium Appcelerator и пытаюсь создать в XCode дополнительный модуль, который позволит мне отправлять событие в календарь iPhone. Что я хотел бы сделать, так это рассчитать дату и время в секундах с 1 января 2001 года (по Гринвичу) и отправить их непосредственно в календарь, не прибегая к работе со строкой до даты, которая, кажется, всегда возвращает не то время. На данный момент я не смог получить целое число в полях даты события, оба из которых являются типами NSDate.

Titanium принимает аргументы из Javascript и компилирует их в объектный код, так что я могу назвать свой объект "cal" следующим образом:

var startDate = 316367923;
var endDate = 316367923;    
var results = cal.newEvent(startTime,endTime)

. , , и вот как объект "cal" получает этот вызов:

-(BOOL)newEvent:(id)args {
    id startDate = [args objectAtIndex:0];
    id endDate = [args objectAtIndex:1];
    ...

То, что я надеюсь сделать, получить эти целые числа в объект события:

EKEventStore *eventDB = [[EKEventStore alloc] init];
EKEvent *theEvent  = [EKEvent eventWithEventStore:eventDB];
...
theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) startDate];
theEvent.endDate   = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) endDate];

Это компилируется без ошибок, но, тем не менее, заставляет мое приложение бомбить, поэтому я полагаю, что в моем понимании чего-то не хватает. Любая идея о том, где я иду не так?

Спасибо

Mark

Ответы [ 4 ]

6 голосов
/ 10 января 2011

Вполне вероятно, что 'args' - это NSArray, поэтому startDate и endDate являются объектами, а не литералами.Вы, вероятно, хотите сделать что-то вроде:

theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:[startDate intValue]];

Если, например, startDate является NSNumber.В противном случае, ознакомьтесь с документами Titanium, чтобы узнать тип передаваемых чисел.

0 голосов
/ 10 января 2011

Я сомневаюсь, что твоя авария как-то связана с этим, но ты, возможно, протекаешь. Линии:

theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) startDate];
theEvent.endDate   = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) endDate];

назначить объект с сохранением количества 1, если установщик для startDate и EndDate вступает во владение ими (я не знаю, будет ли это делать Java, или нет, поэтому я могу ошибаться), прежде чем хранить их в локальной переменной назначив их событию, чтобы потом можно было вызвать релиз. так это будет выглядеть так:

    NSDate *sDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:[startDate intValue]];
   theEvent.startDate = sDate;
   [sDate release];
0 голосов
/ 10 января 2011

Держу пари, что startDate и endDate преобразуются в объекты NSNumber вместо целых. Поэтому попробуйте следующие строки:

theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) [startDate intValue]];
theEvent.endDate   = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) [endDate intValue]];
0 голосов
/ 10 января 2011

Это может быть не причиной вашего сбоя, но метод initWithTimeIntervalSinceReferenceDate NSDate ожидает, что NSTimeInterval (определенный как typedef double NSTimeInterval) не является целым числом.

т. Е. Сигнатура метода:

- (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds
...