2011-03-05 18 views
14

Mac geliştirme konusunda oldukça yeni (bir web ve iOS arka planından geliyor) ve NSTextView değerinin değiştiği her seferinde nasıl bildirim alabileceğimi bilemiyorum. Herhangi bir fikir? Nstextfield temsilcisiniNSTextView değeri değiştirildi

cevap

35

ups sadece NSTextView bir geri istiyoruz ve sadece protokol temsilci olmalıdır nesnenin başlığında eklemek

NSTextField değil gördü

@interface delegateAppDelegate : NSObject <NSApplicationDelegate, NSTextViewDelegate> { 
    NSWindow *window; 
} 

Bundan sonra

-(void)textDidChange:(NSNotification *)notification { 
    NSLog(@"Ok"); 
} 

gibi bir yöntem temsilci İşte

+0

İşte bu! Eminim bu, denediğim şeylerden biriydi, ama belli ki doğru bir şekilde anlamadı. Şimdi çalışıyor :-) Teşekkürler! – tarnfeld

+2

NSTextViewDelegate, NSTextDelegate uygular, ancak NSTextViewDelegate yöntemlerini de kullanabilirsiniz. - (BOOL) textView: (NSTextView *) aTextView shouldChangeTextInRange: (NSRange) effectiveCharRange replacementString: (NSString *) replacementString – valexa

+5

Bu yalnızca kullanıcıdan değişiklikler alır NSTextView ile doğrudan etkileşimde bulunma (örn. metin görünümündeki kullanıcı türleri veya kopyaları kopyalayıp yapıştırır veya keser). TextView.string = @ "Foo"; 'da olduğu gibi textView programsal olarak değiştirirseniz, textView değişiklikleri yakalamaz. Bunun için textview'in textStorage dergisi olmanız gerekir; textView.textStorage.delegate = self; 've (- void) textStorageWillProcessEditing: (NSNotification *) aNotification 'öğesinin kendisinde olan nesnenin sınıfı. Bu, hem kullanıcı güdümlü değişikliklere hem de doğrudan özellik ayarlayıcı değişikliklerine sahip olur. – Joel

-1

ayarlayın. Eğer .m dosyasında temsilci protokolünü eklemek temsilci .h dosyasında Eğer -(void)controlTextDidChange:(NSNotification *)obj { NSLog(@"ok"); }

gibi bu temsilciyi ayarlayın ve sonra kullanmak

+1

bu NSTextField değil NSTextView için – valexa

+0

NSTextView NSTextField bir alt sınıfıdır ve böylece delegeleri – kezi

+3

Korkarım ki https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSTextView_Class/Reference/Reference.html açıkça NSTextView NSView miras gelen NSText miras gösterir. NSTextField, NSView'den devraldığı NSControl'den miras alır. controlTextDidChange, NSTextField'in ControlTextDidChange öğesine erişimi olduğunu, ancak NSTextView'ın NSControl veya NSTextField ürününden devralmadığı için bir delege yöntemidir. –

-2

yardımcı olur umarım bir yöntemi ekleyin

- (void) controlTextDidChange: (NSNotification *) notification 
{ 
} 
+1

bu NSTextField değil NSTextView için – valexa

+0

NSTextView NSTextField bir alt sınıfıdır ve böylece delegeler – kezi

+6

kdogisthebest NSTextView NSTextField bir alt sınıf değil. –

2

almalıdır nesneyle NSTextView (değil NSScrollView) ait temsilci özelliğini bağlı emin olun eklemek çözüm:

NSTextView *textView = ...; 

@interface MyClass : NSObject<NSTextStorageDelegate> 
@property NSTextView *textView; 
@end 

MyClass *myClass = [[MyClass alloc] init]; 
myClass.textView = textView; 
textView.textStorage.delegate = myClass; 

@implementation MyClass 
- (void)textStorageDidProcessEditing:(NSNotification *)aNotification 
{ 
    // self.textView.string will be the current value of the NSTextView 
    // and this will get invoked whenever the textView's value changes, 
    // BOTH from user changes (like typing) or programmatic changes, 
    // like textView.string = @"Foo"; 
} 
@end 
İlgili konular