IBOutlet và IBAction


159

Mục đích của việc sử dụng IBOutlets và IBActions trong Xcode và Interface Builder là gì?

Nó có khác biệt gì không nếu tôi không sử dụng IBOutlets và IBActions?


Nhanh:

@IBOutlet weak var textField: UITextField!

@IBAction func buttonPressed(_ sender: Any) { /* ... */ }

Mục tiêu-C:

@property (nonatomic, weak) IBOutlet UITextField *textField;

- (IBAction)buttonPressed:(id)sender { /* ... */ }

12
Tất cả các câu trả lời đều đề cập đến cùng một loại ý tưởng .. nhưng không ai giải thích được tại sao Trình tạo giao diện dường như hoạt động giống nhau nếu bạn KHÔNG bao gồm IBAction / IBOutlet trong nguồn của mình. Có một lý do nào khác cho IBAction và IBOutlet hay bạn có thể bỏ chúng đi không?
bobobobo

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

IBActions tồn tại như một phần của cơ chế tương tác hành động đích, bạn có thể đọc về cách IBAction phù hợp với điều đó tại đây: developer.apple.com/l Library / ios / document / General / [ Bạn có thể đọc trên Outlets tại đây: developer.apple. com / thư viện / ios / tài liệu / Chung / Khác
William Power

Câu trả lời:


208

IBActionIBOutletlà các macro được định nghĩa để 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.

IBActiongiải quyết voidIBOutletgiải quyết thành không có gì, nhưng chúng biểu thị cho Xcode và Trình tạo giao diện rằng các biến và phương thức này có thể được sử dụng trong Trình tạo giao diện để liên kết các thành phần UI với mã của bạn.

Nếu bạn hoàn toà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 sẽ sử dụng nó, thì bạn cần chỉ định IBActioncho các phương thức sẽ được sử dụng trong IB và IBOutletcho các đối tượng nó sẽ được sử dụng trong IB.


@Jasarien "bạn cần chỉ định IBAction cho các phương thức sẽ được sử dụng trong IB và IBOutlet cho các đối tượng sẽ được sử dụng trong IB." Có gì khác biệt ?
cyrilchampier

3
@nerith Sự khác biệt giống nhau 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

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

38

Cách truyền thống để gắn cờ một phương thức để nó sẽ xuất hiện trong Trình tạo giao diện và bạn có thể kéo một kết nối đến phương thức đó, là tạo 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 trống, thay vào đó (IBAction là # xác định là void) và cung cấp một đối số (id), phương thức vẫn hiển thị. Điều này cung cấp thêm tính linh hoạt, al

Tất cả 3 trong số này có thể nhìn thấy từ Trình tạo giao diện:

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

Xem Hướng dẫn sử dụng Trình tạo giao diện của Apple để biết chi tiết, đặc biệt là phần có tên Tích hợp Xcode.


1
Dưới đây là một liên kết đến hướng dẫn ở trên được đề xuất: developer.apple.com/l
Library / ios / recipes / Kẻ

32

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 một nút và nhãn trong IB. Để tự động thay đổi giá trị của nhãn bằng cách nhấn nút, bạn sẽ xác định một hành động và thuộc tính trong ứng dụng của mình tương tự như:

UILabel IBOutlet *myLabel;
- (IBAction)pushme:(id)sender;

Sau đó, trong IB, bạn sẽ kết nối myLabel với nhãn và kết nối phương thức 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ó vẫn hoạt động nếu bạn không bao gồm nhãn IBOutlet ..?
bobobobo

7
Vì các macro này không làm gì vào thời gian biên dịch, chúng chỉ đơn giản để ứ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 tạo 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 tạo ra vấn đề nữa.
Ngày của Nathan ngày

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

7

Trình tạo giao diện sử dụng chúng để xác định những 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 bạn.

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


7

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

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

Cách tải tệp nib, ảnh chụp màn hình sách trực tuyến của Matt cho iOS6


Câu trả lời này giải thích tại saolàm thế nào IBOutlets hoạt động, không chỉ những gì họ làm .
Jeffery Opoku-Mensah

4

Một Outlet là một liên kết từ mã đến UI. Nếu bạn muốn hiển thị hoặc ẩn phần tử UI, 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 một phần tử (hoặc một trăm thứ khác), bạn phải xác định một ổ cắm của đối tượng đó trong các nguồn và liên kết ổ cắm đó thông qua giao diện của đối tượng, hướng tới các thành phần UI. 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 thức đặc biệt được kích hoạt bởi các đối tượng giao diện người dùng. Giao diện 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 xin vui lòng tham khảo Apple Docs


Uhm, không, đó không phải là IBOutlet. Nơi mà bạn có được ý tưởng đó?
Richard J. Ross III

3

IBAction và IBOutlets được sử dụng để kết nối giao diện của bạn được tạo trong Trình tạo giao diện với bộ điều khiển của bạn. Nếu bạn không sử dụng Trình tạo giao diện và xây dựng giao diện hoàn toàn bằng mã, bạn có thể tạo 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 đều sử dụng Trình tạo giao diện, một khi bạn muốn có một số tương tác diễn ra trong giao diện của mình, bạn sẽ phải sử dụng IBActions và IBoutlets.


2

IBOutlet

  • Nó là một tài sản .
  • Khi tệp nib (IB) được tải, nó trở thành một phần của dữ liệu được đóng gói kết nối với một biến thể hiện.
  • Mỗi kết nối không được lưu trữ và thiết lập lại.

IBAction

  • Thuộc tính chỉ ra rằng phương thức là một hành động mà bạn có thể kết nối từ bảng phân cảnh của mình trong Trình tạo giao diện.

@ - Mô hình động IB - Trình tạo giao diện


2

Một trong những ý kiến ​​hàng đầu về Câu hỏi này đặc biệt hỏi:

Tất cả các câu trả lời đều đề cập đến cùng một loại ý tưởng .. nhưng không ai giải thích được tại sao Trình tạo giao diện dường như hoạt động giống nhau nếu bạn KHÔNG bao gồm IBAction / IBOutlet trong nguồn của mình. Có một lý do nào khác cho IBAction và IBOutlet hay bạn có thể bỏ chúng đi không?


Câu hỏi này được NSHipster trả lời tốt:

IBAction

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction

Đầu năm 2004 (và có lẽ sớm hơn), IBAction không còn cần thiết cho một phương thức được Trình tạo giao diện chú ý. Bất kỳ phương thức nào có chữ ký -(void){name}:(id)sendersẽ hiển thị trong khung cửa hàng.

Tuy nhiên, nhiều nhà phát triển thấy hữu ích khi vẫn sử dụng kiểu trả về IBAction trong khai báo phương thức để biểu thị rằng một phương thức cụ thể được kết nối bằng một hành động. Ngay cả các dự án không sử dụng Storyboards / XIB cũng có thể chọn sử dụng IBAction để gọi ra các phương thức mục tiêu / hành động.

IBOutlet:

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet

Không giống như IBAction, IBOutlet vẫn được yêu cầu để kết nối các thuộc tính trong mã với các đối tượng trong Storyboard hoặc XIB.

Kết nối IBOutlet thường được thiết lập giữa chế độ xem hoặc điều khiển và bộ điều khiển chế độ xem quản lý của nó (điều này thường được thực hiện ngoài bất kỳ IBActions nào mà bộ điều khiển chế độ xem có thể được nhắm mục tiêu để thực hiện bởi bộ phản hồi). Tuy nhiên, IBOutlet cũng có thể được sử dụng để hiển thị một thuộc tính cấp cao nhất, giống như một bộ điều khiển khác hoặc một thuộc tính mà sau đó có thể được truy cập bởi bộ điều khiển xem tham chiếu.


1

Khi bạn sử dụng Trình tạo giao diện, bạn có thể sử dụng Trình kiểm tra kết nối để thiết lập các sự kiện với các trình xử lý sự kiện, các trình xử lý sự kiện được coi là các chức năng có công cụ sửa đổi IBAction. Một khung nhìn có thể được liên kết với tham chiếu cho cùng loại và với bộ sửa đổi IBOutlet.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.