Soru Nesnel-c protokollerinin tanımlanması ve kullanılması


NSImageView'ı genişletmeye çalışıyorum, böylece sürükleme / bırakma sorumluluğunu denetleyiciye devredebilirim. Her şey, derleyicinin şimdi tür kimliğine sahip nesnelere mesaj gönderme konusunda uyarılar görüntülediği bir sorunla iyi çalışıyor. Bunu çözmek için, Ivar'ın türünü protokolün adıyla eklemem gerektiğini varsaydım. Ancak, bu, protokol için tanımını bulamadığı mesajıyla sefil bir şekilde başarısız olur.

#import <Cocoa/Cocoa.h>


@interface DragDropImageView : NSImageView {
    id <DragDropImageViewDelegate> _delegate;
}

@property (readwrite, retain) id <DragDropImageViewDelegate> delegate;

@end

@protocol DragDropImageViewDelegate

@optional

- (NSDragOperation)dragDropImageView:(DragDropImageView *)ddiv validateDrop:(id     <NSDraggingInfo>)info;
- (BOOL)dragDropImageView:(DragDropImageView *)ddiv acceptDrop:(id <NSDraggingInfo>)info;
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender;  

@end

Yanlış gidebileceğim herhangi bir işaretçi var mı? Eminim basit bir şey olmalı, ama obj-c'ye oldukça yeniyim.


22
2018-06-10 14:18


Menşei


Güzel soru için +1. - Md Mahbubur Rahman
anahtar kelimeler: ileri bildirim. - holex


Cevaplar:


Doğru yoldasınız ama biraz arkaik olan C derleyicisine asılıyorsunuz. Komut dosyası boğuluyor çünkü protokolün tanımı kullandığınız anda mevcut değil. @protocol DragDropImageViewDelegate kullanmadan önce tanımlanmalıdır id< DragDropImageViewDelegate> bir tür olarak. @Protocol tanımını kullanımdan önce (örneğin, @interface'inizden önce) taşıyabilir veya

@protocol DragDropImageViewDelegate;

@interface'den (bir ileri bildirim) önce ve @protocol bildirimini olduğu yerde bırakın.


31
2018-06-10 14:49



Güzel. Teşekkür ederim. Aslında ileri bildirim için gitmek gerekiyordu çünkü protokol tanımlamasını @implementation üzerinde harekete geçirdi ve daha önce tanımlanmadan önce DragDropImageView'a atıfta bulunulan protokol konusunu tanıttı. Yardım ettiğin için teşekkür ederim! - Tricky
Evet, elbette yapardı. Genel olarak, ileri bildirim, bu türün dairesel bağımlılıklarına çözümdür. - Barry Wark
Nice Cevabı için +1. Küçük bir sorgum var, yazarken \ @protocol DragDropImageViewDelegate; önce \ @interface, sonra derleyici tarafından ne yapılır? - Md Mahbubur Rahman


Genel bir kural olarak, önce protokolü tanımlıyorum.

@class DragDropImageView;

Ama sen tersini yapabilirsin ve aldığın zamanla:

@protocol DragDropImageViewDelegate;

Benim düşünceme göre, protokol deklarasyonun önemli bir parçası ve oldukça kısa olma eğilimindedir, bu yüzden ben başlık dosyasının alt kısmında kaybolmak yerine ilk önce gitmek tercih ederim, ama onun bir tat meselesi.


10
2018-06-11 02:03