2012-08-12 13 views
5

İletiler Uygulamasında konu satırının denetimini almaya çalışıyorum. Şu anda sadece konu alanında metni göstermeye çalışıyorum.Teoriler: ChatKit'teki CKContentEntryView'den UIView _subjectLine'i devralmaya çalışıyorum

Sahip olduğum ana sorun, derleyicinin geçerli bir görünüm olarak _subjectLine tanımasını sağlamaktır.

Tweak.xm:8: error: ‘_subjectLine’ was not declared in this scope 

nasıl bir çimdik kullanılacak mevcut bir öğeyi beyan etmek bir fikrin yok: Bu benim _subjectLine ile/denemek ve bir şey yaparsanız ne alıyorum. Xcode'da kullandığım, genellikle bir başlık dosyasında bulunan standart bildirimler, aynı şekilde çalışmıyor gibi görünmektedir.

Yaklaşık bir haftadır etrafta dolaşıyorum. Bulduğum en yaygın öğretici ya da bilgi sadece basit yapmaktı: yöntem etkinleştirildiğinde - uyarı uyarısı. Bunu yapabilirim, sorun değil. Ancak, zaten var olan bir nesneyi kullanmam gerek.

cevap

8

sizin durumda çektiğinizi olan sınıfın değişken bir örneğini kullanmaya çalışıyor gibi görünüyor. Örnek değişkenini değiştirmek tweaks'de bu şekilde çalışmaz. MSHookIvar'ı bir örnek değişkenini (aka ivar) 'kancalamak' için kullanmalısınız. Örnek:

[Tweak.xm/aa]

#import <substrate.h> // necessary 
#import <Foundation/Foundation.h> 

@interface TheClassYouAreHooking : NSObject { 
    NSString *_exampleVariable; 
} 
- (void)doSomething; 
@end 

NSString *_exampleVariableHooked; 

%hook TheClassYouAreHooking 
- (void)doSomething 
{ 
    // 'Hook' the variable 

    exampleVariableHooked = MSHookIvar<NSString *>(self, "_exampleVariable"); 

    // The name of the hooked variable does not need to be the same 

    exampleVariableHooked = @"Hello World"; 

    // You can do ANYTHING with the object Eg. [exampleVariableHooked release]; 

} 
%end 
bunu ithalat gerekir, böylece

MSHookIvar da bool değerlerden oluşan ve yüzen vb

exampleVariableHooked = MSHookIvar<BOOL>(self, "_someBOOL"); 

Its gibi şeyler substrate.h ilan kanca Aksi halde tweak'inizi derleyemezsiniz. Ayrıca bir bonus ipucu olarak, tweakname.plist'inizde çektiğiniz uygulama/çerçevenin tanımlayıcısını koymanız gerektiğini hatırlatıyorum.

Değişkeni çektikten sonra, ihtiyaçlarınıza uyacak şekilde değiştirebilirsiniz. Mutlu kodlar!

1

ChatKit'e aşina değilim, ama hızlı bir bakış attı. _subjectLine'e erişemiyor çünkü bir ivar. Sadece CKTextContentView bir setText yöntem vardır, ancak bu parametre beri bekliyor ne hiçbir fikri id

id subject = [myCKContentEntryView subject]; // should return a CKTextContentView 
NSAssert([subject isKindOfClass:[CKTextContentView class]], @"ack"); 
CKTextContentView * myTextContentView = subject; 

erişmek gerekir. Bir görünüm olabilir (UILabel?) Veya bir ip çekebilir.

[myTextContentView setText:@"Hello World, w/ jimmies!"]; 

ve ne olduğunu görün: Sen deneyebilirsiniz.

2

Ayrıca şöyle, örnek değişkeni erişmek için Objective-C çalışma zamanı işlevlerini kullanabilirsiniz:

UIView *subjectLine; 
object_getInstanceVariable(self, "_subjectLine", (void **)&subjectLine); 
1

Sen KVC kullanabilirsiniz. Örnek: [object valueForKey: @ "her neyse"];

Her yerde çalışır ve Objective C çalışma zamanı yöntemlerini veya Mobil Substrat'ı kullanmaktan daha temizdir.

+0

Ancak bir sınıf KVC yöntemlerinin üzerine yazabilir ve kullanılamaz/kullanılamaz hale getirebilir. – Aehmlo