2009-05-07 32 views
7

Tôi muốn gửi một hành động đến một đối tượng khác bằng cách sử dụng ca cao. Lý tưởng nhất là tôi cũng muốn nó xuất hiện trong Trình xây dựng giao diện.Gửi một ca cao hành động - IBAction

Tôi đã thử tài liệu về táo, nhưng có điều tôi đang thiếu. Thêm những điều sau đây, việc xây dựng giao diện chỉ hiển thị hành động như là một nhận được.

- (IBAction)setTarget:(id)anObject; 
- (IBAction)setAction:(SEL)aSelector; 

ai đó có thể vui lòng cho tôi ví dụ về cách tạo hành động đã gửi. Cảm ơn


Tôi có hành động nhận được xác định trong bộ điều khiển của mình1. Sau đó tôi muốn controller2 của tôi để có thể gửi một hành động để controller1 (như NSButton không). Trong giao diện xây dựng, bạn có thể kéo một dòng TỪ NSButton để điều khiển mà sẽ nhận được tín hiệu. Chức năng này không thể giới hạn đối với các đối tượng táo ở đó, phải là một cách để thực hiện nó.

Trả lời

1

controller1 và controller2 là một lớp con của NSControl.

[controller2 sendAction:@selector(receiveAction:) to:controller1]; 
0

Hành động luôn được một đối tượng nhận. Nếu bạn muốn gửi thông tin theo một hướng khác, bạn có thể muốn có một lối thoát: tìm IBOutlet.

+0

Cách thực hiện các nút, ví dụ: NSSegmentedcontrol gửi chuyển đổi: sau đó? –

+0

NSSegmentedControl chỉ có thể gửi 'toggle:' đến một đối tượng chấp nhận thông điệp đó. aroneous là chính xác: hành động được khai báo bởi người nhận, chứ không phải bởi người gửi. –

+0

Có tôi có hành động nhận được xác định trong controller1 của tôi. Sau đó tôi muốn controller2 của tôi để có thể gửi một hành động để controller1 (như NSButton không). Trong giao diện xây dựng, bạn có thể kéo một dòng TỪ NSButton để điều khiển mà sẽ nhận được tín hiệu. Chức năng này không thể giới hạn đối với các đối tượng táo ở đó, phải là một cách để thực hiện nó. –

1

NSButton là NSControl và do đó có "hành động" mà bạn có thể kết nối - một thông báo được gửi khi bạn kích hoạt kiểm soát (ví dụ: nhấp vào nút). Một bộ điều khiển không có một hành động (nó sẽ có nghĩa là gì - làm thế nào bạn sẽ gây ra tin nhắn được gửi?), Vì vậy, những gì bạn đang cố gắng làm không thực sự có ý nghĩa.

Nếu bạn muốn controller2 có thể có controller1 làm điều gì đó, bạn nên tạo ổ cắm trên controller2 (loại controller1 hoặc giao diện nào đó), kết nối nó với controller1 trong IB, và sau đó bạn có thể gửi bất kỳ tin nhắn nào bạn muốn từ controller2 đến controller1 programatically.

1

Bạn sẽ có thể thực hiện việc này nếu lớp học Controller2 của bạn là lớp con của NSControl. NSControl xác định "hành động đã gửi" là những gì bạn đang kết nối với đối tượng mục tiêu của mình khi bạn kéo từ NSButton trong Trình tạo giao diện. Điều đó đang được nói, có (là?) Một lỗi trong IB 3.0 ngăn chặn hành động được gửi từ hiển thị trong IB. Xem this cocoa-dev thread để biết chi tiết.

17

IBAction là chỉ thị tiền xử lý cho Trình tạo giao diện biết "đây là điều bạn nên biết". Nó thực sự đánh giá là void. Điều đó có nghĩa là các "hành động" là phương pháp chỉ bình thường mà bạn có thể gọi theo cách thông thường:

[target someMethod:self]; 

Nếu bạn muốn bắt chước hành vi mà bạn có thể nhận được từ một NSButton, bạn có thể thêm một lối thoát cho các mục tiêu và một tài sản cho bộ chọn (như là một chuỗi):

@property (nonatomic, retain) IBOutlet id target; 
@property (nonatomic, retain) NSString* actionSelectorString; 

Mà bạn sau đó có thể gọi như thế này:

SEL action = NSSelectorFromString(self.actionSelectorString); 
[self.target performSelector:action withObject:self]; 

Nếu bạn muốn lớp học của bạn để dây lên bộ chọn qua kéo và thả trong Interface Builder, cách dễ nhất là làm cho lớp của bạn là lớp con của NSControl (kéo chế độ xem tùy chỉnh từ thư viện đối tượng, Command-6 để hiển thị thanh tra, chọn lớp của bạn trong cửa sổ bật lên trên cùng).Sau đó, bạn có thể "gọi" hành động theo:

- (void) go { 
    [self sendAction:self.action to:self.target]; 
} 
+1

Trình xây dựng giao diện là làng Potemkin cuối cùng. Hoặc có thể giống như ... Một người vợ stepford. Cô ấy cố gắng hết sức để không nhìn thấy những tiếng nổ đang diễn ra ở đó ... Sau đó, bạn nhớ cô ấy là một thị trấn bị đốt cháy đầy ắp lắp ráp C đáng sợ, khỉ, v.v. –

+3

Nói như một người không bao giờ sử dụng bất kỳ thao tác kéo-và nào khác -công cụ xây dựng giao diện giọt, có xu hướng ẩn nhiều hơn nữa và tạo ra một tấn mã mà bạn không được phép chạm vào. IB làm việc với thời gian chạy động của ObjC để làm những việc hữu ích nhưng không phải là phép thuật; một nửa những gì nó làm được giải thích ở trên (nửa kia là thiết lập các thuộc tính), và điều đó không mất nhiều thời gian, phải không? – TALlama

+1

Tôi đang ngớ ngẩn ... và bạn nói đúng ... ngay cả hội đồng tạo Xcode cũng khá dễ đọc và thanh lịch. ('Sản phẩm -> Tạo đầu ra -> Tập tin lắp ráp'). Tuy nhiên, Apple _does_ nhảy một dòng hài hước/vụng về giữa sự từ chối/giả vờ sự thiếu hiểu biết về sự tồn tại của bất cứ thứ gì lỗi thời hoặc vô hình kỹ thuật - bên ngoài ít nhất. Họ chỉ ghi lại các tính năng thời gian chạy mà họ không muốn bạn biết, v.v. Đó là tất cả những điều phức tạp và không quan trọng .. nhưng nó tạo ra một chút phức tạp về những điều thú vị để thảo luận và tìm hiểu, đặc biệt là vì một số trái cây bị cấm cố ý. –

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