0

CRHViewControllerScriptクラスで「bulletedArray」というNSArrayを作成しましたが、同じ配列にアクセスして、CRHCommentSectionクラスのNSLogに書き出そうとしています。しかし、それは配列を書き込んでいません。私は配列が機能することを知っており、ファーストクラスでそれを書き出すことができます。次のクラスにたどり着く方法は悪いと思いますが、コードは次のようになります。

「CRHViewControllerScript.h」

@interface CRHViewControllerScript : UIViewController <UITextViewDelegate> {

__weak IBOutlet UITextView *myTextView;

}

+ (NSArray*)theArray;
- (IBAction)chalkYes:(id)sender;
@end

「CRHViewControllerScript.m」

#import "CRHViewControllerScript.h"

static NSArray* bulletedArray = nil;

@interface CRHViewControllerScript ()

@end

@implementation CRHViewControllerScript

+ (NSArray*)theArray {
return bulletedArray;
}

- (IBAction)chalkYes:(id)sender {

//get the text inside the textView
NSString *textContents = myTextView.text;

textContents = [textContents stringByReplacingOccurrencesOfString:@"\n" withString:@""];

//make the array
NSArray *bulletedArray = [textContents componentsSeparatedByString:@"\u2022"];

//eliminate blank component at top of the array ("")
NSUInteger len = bulletedArray.count;
if (bulletedArray.count) {

    bulletedArray = [bulletedArray subarrayWithRange:NSMakeRange(1, len-1)]; 
}

//print out array 
NSLog(@"%@",bulletedArray); 

}

CRHCommentSection.h

#import <UIKit/UIKit.h>

@interface CRHCommentSection : UIViewController




@end

CRHCommentSection.m

#import "CRHCommentSection.h"
#import "CRHViewControllerScript.h"

@interface CRHCommentSection ()

@end

@implementation CRHCommentSection

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    NSArray *myArray = [CRHViewControllerScript theArray]; // This is how to call a Class     Method in Objective C
    NSLog(@"%@", myArray); 
}
4

3 に答える 3

1
//make the array
NSArray *bulletedArray = [textContents componentsSeparatedByString:@"\u2022"];

bulletedArrayこれにより、スコープ内にあるという名前の新しい変数が作成されます

-(IBAction)chalkYes:(id)sender {

そのため、外部で宣言したグローバルなものをマスクします。NSArray*問題を解決するには、その先頭から を削除するだけです。

bulletedArray = [textContents componentsSeparatedByString:@"\u2022"];

編集:

-インスタンスレベルのメソッドとクラスレベルのメソッドの命名法は、それぞれまたはで始まるメソッドの違い+です。

コードで+(NSArray*)theArray;は、 はクラスレベルのメソッドで[CRHViewControllerScript theArray];あり、メソッドのレシーバーとしてクラス名を使用して呼び出すことができます。

はインスタンス-(IBAction)chalkYes:(id)sender;レベルのメソッドであり、次のようなクラスの実際のインスタンスで呼び出す必要があります。[myCRHViewScript chalkYes:nil];

@ user490696 が指摘したように、理想的には、配列をグローバル スコープに格納するのではなく、インスタンス レベルのプロパティに格納し、メソッドから返す必要があります。たとえば、myTextView変数は ivar またはインスタンス変数です。これは、クラスのインスタンスごとに格納される変数です。次のように、この変数を返すメソッドを作成できます。

-(UITextView*) getTextView
{
    return myTextView;
}
于 2012-08-08T19:27:33.153 に答える
0

クラスからではなく、インスタンスから呼び出す必要があります。

にプロパティを追加するだけCRHCommentSectionです:

@property(strong, nonatomic) CRHViewControllerScript *theControllerScript

このようにアプリデリゲートのインスタンスをインスタンスに設定しCRHViewControllerScriptますCRHCommentSection

theCRHCommentSection.theControllerScript = theViewCRHViewControllerScript; //replace those Values with the actual ones

CRHCommentSection次のようにアクセスできます。

[self.theControllerScript theArray];
于 2012-08-08T19:52:10.913 に答える
0
NSArray *bulletedArray = [textContents componentsSeparatedByString:@"\u2022"];

//eliminate blank component at top of the array ("")
NSUInteger len = bulletedArray.count;
if (bulletedArray.count) {

    bulletedArray = [bulletedArray subarrayWithRange:NSMakeRange(1, len-1)]; 
}

上記のコードは、宣言した static には影響しません。地元の宣言

NSArray *bulletedArray //hides the static variable

ローカル変数の名前を変更してから、それが意図されている場合は static に割り当て直します。

于 2012-08-08T19:27:48.300 に答える