Вы можете использовать интерфейс RouteComponentProps
, который объявляет все реквизиты, переданные withRouter
:
import { RouteComponentProps } from 'react-router-dom';
..
interface ChildComponentProps extends RouteComponentProps<any> {
/* other props for ChildComponent */
}
const ChildComponent : React.SFC<ChildComponentProps> = ({ history }) => (
..
);
Параметр type для RouteComponentProps
является типом свойства params
в match
, поэтому он вам не понадобится, если вы не сопоставляете именованные сегменты пути.
В качестве альтернативы, если history
не прибывает из withRouter
, но пропущен сам как опора, вы можете импортировать тип из history
:
import { History } from 'history';
..
interface ChildComponentProps {
history : History
/* other props for ChildComponent */
}
const ChildComponent : React.SFC<ChildComponentProps> = ({ history }) => (
..
);
Я должен был сохранить связь с таймером, сохранив ее. :) Я задал этот вопрос 5 месяцев назад, и удивительно, сколько еще опыта я приобрел. :)
timer = [ [NSTimer scheduledTimerWithTimeInterval: ...] retain];
...
...
[timer invalidate];
[timer release];
Вы забыли отпустить таймер в viewWillDisappear:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[timer invalidate];
[timer release];
timer = nil;
}
Однако это не должно вызывать срабатывание таймера ...
Из сделать недействительным
документ говорит
«Цикл выполнения удаляет и освобождает таймер либо непосредственно перед возвратом метода недействительности, либо позже. "
Я полагаю, ваш будет удален в какой-то момент.
Метод, вызываемый таймером, должен иметь определение
- (void)methodName:(NSTimer *)aTimer;
Таким образом метод имеет экземпляр таймера, который был запущен. Как вы это делаете, метод не будет знать, был ли таймер недействителен или нет.
Попробуйте изменить инициализацию таймера на
timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector(timerAction:) userInfo:nil repeats:YES]
, а метод на
-(void) timerAction:(NSTimer *)aTimer{...}
Надеюсь, что это поможет
Возможно, это не проблема, но вам необходимо сохранить ссылку на таймер, возвращаемую из scheduleTimerWithInterval :. Без этого указатель на таймер может оказаться недействительным к тому моменту, когда вы остановите его.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
timer = [[NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(timerAction) userInfo:nil repeats:YES] retain];
}
- (void)viewDidDisappear:(BOOL)animated
{
[timer invalidate];
[timer release];
timer = nil;
[super viewDidDisappear:animated];
}
- (void)dealloc
{
[timer invalidate];
[timer release];
timer = nil;
[super dealloc];
}
Также попробуйте установить точку останова в viewDidDisappear и убедитесь, что он вызывается!