2012-05-28 3 views
1

NSTimer을 사용하는 방법을 배우려하고 있습니다. 다음과 같은 생각을했습니다. 스위치를 만듭니다. 앱이 시작되면서 타이머를 시작하고 매 초 후에 스위치의 상태를 변경하는 함수가 호출됩니다. 내가 타이머와 헤더 파일 ViewControl.h의 스위치 모두를 선언NSTimer로 UISwitch를 뒤집기

: 여기

내가 지금까지 무슨 짓을했는지

//Timer 
{NSTimer *timer;} 
@property (weak, nonatomic) IBOutlet UISwitch *zeSwitch; 

그런 다음 ViewControl.m 파일에서 나는 다음과 같은 정의 :

- (IBAction)zeSwitch:(id)sender { 
    UISwitch *zeSwitchSatus = (UISwitch *) sender; 
    BOOL yn = zeSwitchSatus.isOn; 
    [zeSwitch setOn:yn animated:YES]; 

}  

- (void)viewDidLoad 
{ 

    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self 
    selector:@selector(zeSwitch) userInfo:nil repeats:YES]; 


    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

그래서 코드를 실행하면 켜기/끄기 스위치가 표시됩니다. 그러면 시간이 지남에 따라 자동으로 상태가 변경되는 것을 볼 수 있습니다.

image!

그러나 그것은 작동하지 않았다! 먼저 위의 이미지를 얻습니다. 아무것도 바뀌지 않습니다. 그런 다음 스위치를 누르면 충돌이 발생합니다. (하지만 내 생각은 전혀 그것을 만지지 않습니다.)

아이디어가 있으십니까?

+0

"작동하지 않음"이라고 말하면 충돌이 발생한다는 뜻입니까? –

+0

먼저 위의 이미지를 얻습니다. 아무것도 바뀌지 않습니다. 그런 다음 스위치를 누르면 충돌이 발생합니다. (하지만 내 생각은 전혀 그것을 만지지 않습니다.) – stupidity

+0

할 것입니다. 팁 고마워. – stupidity

답변

4

꽤 가깝습니다. 여기 몇 가지 잘못된 점이 있습니다. 첫째, 타이머에주는 방법은 zeSwitch:입니다. 콜론이 중요합니다. 그래서 당신은 다음과 같이 타이머를 작성해야합니다 : 당신이 당신의 재산 zeSwitch 이름을했기 때문에

timer = [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
             selector:@selector(zeSwitch:) 
             userInfo:nil    //^ Note colon! 
             repeats:YES]; 

콜론없이 zeSwitch라는 이름의이 방법은 실제로 스위치에 대한 접근 방법이다. 이를 명확히하기 위해 타이머의 액션 메소드의 이름을 변경해야합니다. 지금 타이머는 매초마다 스위치에 대한 접근 자 메서드를 호출합니다. 실제로는 아무 것도하지 않습니다.

다음으로 타이머는 을 호출하는 메서드에 전달합니다. zeSwitch:에있는 sender 인수는 스위치가 아닌 타이머가 될 것입니다. 타이머를 통해 실제로이 메소드가 호출 된 경우 타이머에 isOn을 전송할 것이기 때문에 충돌이 발생하고 이에 응답하지 않습니다.

스위치에 출구를 가지고, 그래서 당신은 그 출구를 통해 참조 할 수 있습니다 :이 방법의 이름과 유형을 수정 한

- (void)flipSwitch: (NSTimer *)tim 
{ 
    BOOL switchIsOn = [[self zeSwitch] isOn]; 

공지 사항 - 당신은 또한거야 이를 반영하기 위해 타이머 생성을 변경해야합니다 : @selector(flipSwitch:).

셋째, 스위치를 뒤집으므로 의 반대 위치 인 (현재 상태)으로 설정해야합니다.다음 줄은 할 필요가 :

[[self zeSwitch] setOn:!switchIsOn animated:YES]; 

! 운영자가있는이 NOYES 그 반대의 전환, 붙어하는 BOOL을 부정한다.

+0

만세! 그것은 효과가 있었다. 도움과 조언을 많이 주셔서 감사합니다. D – stupidity

+0

기꺼이 도와 드리겠습니다. –

3

1) 매개 변수 하나를 사용하는 선택기를 지정하면 이름 뒤에 콜론이 필요하므로 @selector(zeSwitch:)이 필요합니다.

2) 타이머에 의해 트리거되는 셀렉터는 스위치가 아닌 매개 변수로 타이머를 가져옵니다. 따라서 - (IBAction)zeSwitch:(NSTimer *)timer.

+0

감사합니다. – stupidity