2009-10-29 26 views
146

Mục đích của việc sử dụng IBAction và IBOutlet trong mã hóa Objective-C cho iPhone là gì, nó có tạo nên sự khác biệt nào nếu tôi không sử dụng chúng không?IBOutlet và IBAction

+12

Tất cả các câu trả lời đề cập đến cùng một loại ý tưởng .. nhưng không ai giải thích tại sao Interface Builder dường như chỉ làm việc tương tự nếu bạn KHÔNG bao gồm IBAction/IBOutlet trong mã nguồn của bạn. Có lý do nào khác cho IBAction và IBOutlet hay không __ok để họ rời khỏi__? – bobobobo

+2

Câu trả lời của Michael Rogers dưới đây bổ sung thêm một chút giải thích về lý do mã hoạt động ngay cả khi IBAction bị bỏ sót. – Krishna

+0

IBActions tồn tại như là một phần của cơ chế tương tác mục tiêu-hành động, bạn có thể đọc về cách IBAction phù hợp với điều đó tại đây: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Target-Action/ Target-Action.html # // apple_ref/doc/uid/TP40010810-CH12 Bạn có thể đọc trên Cửa hàng tại đây: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Outlets /Outlets.html#//apple_ref/doc/uid/TP40010810-CH10-SW1 –

Trả lời

194

IBActionIBOutlet là các macro được xác định để biểu thị các biến và phương thức có thể được tham chiếu trong Trình tạo giao diện.

IBAction giải quyết thành voidIBOutlet không giải quyết được gì, nhưng chúng biểu thị cho Xcode và Trình tạo giao diện có thể sử dụng trong trình tạo giao diện để liên kết các yếu tố giao diện người dùng với mã của bạn.

Nếu bạn không sử dụng Trình tạo giao diện, thì bạn không cần chúng trong mã của mình, nhưng nếu bạn định sử dụng, bạn cần chỉ định IBAction cho các phương pháp sẽ được sử dụng trong IB và IBOutlet cho các đối tượng sẽ được sử dụng trong IB.

+0

@Jasarien "bạn cần chỉ định IBAction cho các phương pháp sẽ được sử dụng trong IB và IBOutlet cho các đối tượng sẽ được sử dụng trong IB". Sự khác nhau là gì? – cyrilchampier

+3

@nerith Sự khác biệt tương tự tồn tại giữa các phương thức và đối tượng. IBActions cho các phương thức, IBOutlet cho các đối tượng. – Jasarien

+0

Chỉ cần làm rõ, vì bài viết của tôi đã được chỉnh sửa, 'IBOutlet' không giải quyết thành' id'. Hãy xem xét điều này: 'IBOutlet UILabel * nameLabel;' - nếu 'IBOutlet' được giải quyết thành' id', thì mã đó sẽ đọc 'id UIlabel * namelabel;' trong đó tạo ra lỗi trình biên dịch. Như tôi đã nói ban đầu, 'IBOutlet' không thể giải quyết được gì. – Jasarien

30

Bạn cần sử dụng IBOutlet và IBAction nếu bạn đang sử dụng trình tạo giao diện (do đó là tiền tố IB) cho các thành phần GUI của bạn. IBOutlet là cần thiết để liên kết các thuộc tính trong ứng dụng của bạn với các thành phần trong IB và IBAction được sử dụng để cho phép các phương thức của bạn được liên kết với các hành động trong IB.

Ví dụ: giả sử bạn xác định nút và nhãn trong IB. Để tự động thay đổi giá trị của nhãn bằng cách đẩy nút, bạn sẽ xác định hành động và tài sản trong ứng dụng của bạn tương tự như:

UILabel IBOutlet *myLabel; 
-(IBAction) pushme; 

Sau đó, trong IB bạn sẽ kết nối mylabel với nhãn và kết nối các phương pháp pushme với nút. Bạn cần IBAction và IBOutlet để các kết nối này tồn tại trong IB.

+13

nhưng tại sao nó __still work__ nếu bạn không bao gồm ghi nhãn IBOutlet ..? – bobobobo

+7

Vì các macro này không làm gì trong thời gian biên dịch nên chúng đơn giản là ứng dụng Xây dựng giao diện có thể tìm thấy các phương thức và tệp trình xây dựng giao diện trong mã nguồn để bạn có thể kéo giữa trình tạo giao diện và mã của mình, một kết nối được thực hiện t vấn đề nữa. –

+0

IBAction không làm gì vào thời gian chỉnh sửa, trong vòng ít nhất là thập kỷ qua. Bạn cũng có thể kết nối phương thức '(void)' trong Trình tạo giao diện. –

3

IBAction và IBOutlets được sử dụng để kết nối giao diện của bạn được tạo trong Bộ dựng giao diện với bộ điều khiển của bạn. Nếu bạn không sử dụng Interface Builder và xây dựng giao diện hoàn toàn bằng mã, bạn có thể tạo một chương trình mà không cần sử dụng chúng. Nhưng trong thực tế hầu hết chúng ta sử dụng Interface Builder, một khi bạn muốn có được một số tương tác trong giao diện của bạn, bạn sẽ phải sử dụng IBActions và IBoutlets.

5

Trình tạo giao diện sử dụng chúng để xác định thành viên và tin nhắn nào có thể được 'kết nối' với các điều khiển giao diện bạn đang sử dụng trong cửa sổ/chế độ xem của mình.

IBOutlet và IBAction hoàn toàn là điểm đánh dấu mà Trình tạo giao diện tìm kiếm khi phân tích cú pháp mã của bạn tại thời điểm thiết kế, chúng không ảnh hưởng đến mã được trình biên dịch tạo ra.

38

Cách truyền thống để gắn cờ một phương thức để nó xuất hiện trong Trình tạo giao diện và bạn có thể kéo kết nối đến nó, đã làm cho phương thức trả về kiểu IBAction. Tuy nhiên, nếu bạn làm cho phương thức của bạn void, thay vào đó (IBAction được định nghĩa # là void), và cung cấp một đối số (id), phương thức vẫn còn nhìn thấy được. Điều này cung cấp thêm tính linh hoạt, al

Tất cả 3 trong số này là có thể nhìn thấy từ Interface Builder:

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender; 

Xem Hướng dẫn sử dụng giao diện Builder của Apple để biết chi tiết, đặc biệt là phần có tiêu đề Xcode Integration.

+1

Đây là liên kết đến hướng dẫn ở trên được đề xuất: https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/_index.html – Aggressor

3

Ổ cắm là liên kết từ mã đến giao diện người dùng. Nếu bạn muốn hiển thị hoặc ẩn phần tử giao diện người dùng, nếu bạn muốn lấy văn bản của trường văn bản hoặc bật hoặc tắt phần tử (hoặc hàng trăm thứ khác), bạn phải xác định lối thoát của đối tượng đó trong nguồn và liên kết ổ cắm đó thông qua "đối tượng giao diện" cho phần tử giao diện người dùng. Sau đó bạn có thể sử dụng ổ cắm giống như bất kỳ biến nào khác trong mã hóa của bạn.

IBAction - một phương pháp đặc biệt được kích hoạt bởi các đối tượng giao diện người dùng. Interface Builder nhận ra chúng.

@interface Controller 
{ 
    IBOutlet id textField; // links to TextField UI object 
} 

- (IBAction)doAction:(id)sender; // e.g. called when button pushed 

Để biết thêm thông tin vui lòng tham khảo Apple Docs

+0

Uhm, không, đó không phải là IBOutlet là gì. Nơi mà bạn có được ý tưởng đó? –

+0

Tôi đã chỉnh sửa câu trả lời của mình –

1

khi bạn sử dụng giao diện Builder, bạn có thể sử dụng kết nối Inspector để thiết lập các sự kiện với bộ xử lý sự kiện, xử lý sự kiện có nghĩa vụ phải là chức năng mà có IBAction bổ nghĩa. Một khung nhìn có thể được liên kết với tham chiếu cho cùng một kiểu và với bộ sửa đổi IBOutlet.

2

Chạy vào biểu đồ trong khi xem mã hóa khóa-giá trị, nghĩ rằng nó có thể giúp ai đó. Nó giúp với sự hiểu biết về những gì IBOutlet là.

Bằng cách xem luồng, người ta có thể thấy rằng IBOutlets chỉ ở đó để khớp với tên thuộc tính có tên điều khiển trong tệp Nib.

How nib file is loaded, screenshot of Matt's online book for iOS6

+0

Câu trả lời này giải thích _why_ và _how_ IBOutlets hoạt động, không chỉ _khi họ làm gì_. –

Các vấn đề liên quan