2011-02-10 40 views
12

Chỉ cần bắt đầu với việc phát triển iPhone và Objective-C.Khi nào sử dụng dấu hai chấm với @selector

Hôm qua tôi đã cố gắng để addObserver cho một thông báo trong một cái nhìn của tôi, và tôi vẫn tiếp tục nhận được lỗi này:

unrecognized selector sent to instance

tôi theo dõi nó xuống đến một thực tế rằng tôi cần phải bao gồm đại tràng trailing đến tôi đối số bộ chọn:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil];

Hôm nay, tôi đã thông minh vì khi thiết lập đối số hành động cho nút, tôi nhớ lỗi lầm của mình hôm qua và thêm dấu hai chấm vào đối số hành động. Đối số hành động có một @selector, giống như đối số bộ chọn trong khi thiết lập một người quan sát cho một NSNotification, vì vậy tôi đã hình dung rằng tôi đang làm đúng.

Tuy nhiên, với đoạn mã sau:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside];

Tôi nhận được cùng một lỗi chính xác:

unrecognized selector sent to instance

gì cho? Tại sao một @selector yêu cầu dấu hai chấm, và cái kia thì không? Các quy tắc tôi nên làm theo là gì khi nó nên được bao gồm và khi nào nó nên được để lại, và tại sao tôi không thể tôi luôn luôn chỉ làm một hay khác?

Cảm ơn!

+1

Đó là dấu hai chấm, không phải là dấu chấm phẩy. Dù sao, nguyên mẫu của phương thức 'nameOfMySelector:' của bạn là gì? Loại đối số nào nó muốn? – BoltClock

+0

Bạn cũng đang đề cập đến cùng một phương pháp trong cả hai trường hợp? – BoltClock

+0

Ha! Một sự giám sát về phía tôi; Tôi đã chỉnh sửa bài viết để chỉ chúng như là dấu hai chấm. – djibouti33

Trả lời

29

Như đã đề cập bởi boltClock, nhân vật bạn đang đề cập đến là thực sự là một dấu hai chấm. Sự khác biệt giữa @selector(method)@selector(method:) là chữ ký phương thức. Biến thể thứ hai mong đợi một tham số được thông qua.

@selector(method) mong chờ phương pháp: -(void)method

@selector(method:) mong chờ phương pháp: -(void)method:(id)someParameter

+3

Ở đó chúng tôi đi, đó là chính xác nó. Làm cho toàn bộ ý nghĩa. Cảm ơn câu trả lời nhanh và cho bài học ngữ pháp :) – djibouti33

8

Bạn dường như thiếu một khái niệm ở đây: dấu hai chấm, theo một cách nào đó, là một phần của tên phương thức. Ví dụ: phương pháp

-(IBAction) doIt:(id)sender; 

có tên doIt:. Vì vậy, đại tràng nên được sử dụng để tham khảo phương pháp này.
Nhưng phương pháp này không có một dấu hai chấm vào cuối

-(IBAction) doItWithoutParameter; 

Cùng đi cho các phương pháp nhận nhiều tranh luận, họ có những cái tên như doItWithParam1:andParam2:

2

Các thư đại tràng chỉ ra rằng phương pháp này có một tham số.

[someObject performSelector:@selector(doSomething:)] có nghĩa là doSomething đang mong đợi một tham số.

[someObject performSelector:@selector(doSomething)] có nghĩa là doSomething không cần bất kỳ thông số nào.

2

Trong trường hợp của bạn:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil]; 

- (void) nameOfMySelector: (NSNotification *) notification { 
    /* this method would require the semi-colon */ 
} 

hoặc trong trường hợp này:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside]; 

- (void) nameOfMySelector: (id) sender { 
    /* this method would also require the semi-colon */ 
} 
5

Một bộ chọn đại diện cho một tên phương pháp, và số lượng các dấu hai chấm trong một selector phù hợp với số lượng đối số trong phương pháp tương ứng:

  1. mySelector - không có dấu hai chấm, không có đối số, ví dụ - (void)mySelector;, [self mySelector];
  2. mySelectorWithFoo: - một dấu hai chấm, một đối số duy nhất, ví dụ: - (void)mySelectorWithFoo:(Foo *)foo;, [self mySelectorWithFoo:someFoo];
  3. mySelectorWithFoo:withBar: - hai dấu hai chấm, hai đối số, ví dụ: - (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;, [self mySelectorWithFoo:someFoo bar:someBar];

v.v.

Cũng có thể có công cụ chọn mà không cần đặt tên tham số. Không được khuyến nghị vì không rõ ngay lập tức các tham số là gì:

  1. mySelector:: - hai dấu hai chấm, hai đối số, ví dụ: - (void)mySelector:(Foo *)foo :(Bar *)bar;, [self mySelector:someFoo :someBar];
  2. mySelector::: - ba dấu hai chấm, ba đối số, ví dụ: - (void)mySelector:(int)x :(int)y :(int)z;, [self mySelector:2 :3 :5];
Các vấn đề liên quan