2

だから私は2つのクラスを持っています。保存ボタンを押すと、self.screen.textbyaddItemメソッドからtotalArrayin クラス 2 に値が渡されます。of メソッドで実行しようとすると、NSLog正しい出力が得られますが、で実行すると、出力は null になります。class1 から class2 のプロパティに渡される値を永続的に保存するにはどうすればよいですか? ありがとうございました。UITableViewController のサブクラスの class2@implementationaddItemviewDidLoad

クラス 1 @インターフェイス

//class1.h
#import class2.h
@interface class1 : superclass {

}

- (IBAction)buttonSave:(id)sender;

Class1 @実装

//class1.m
@interface class1 ()

@end

@implementation class1 {

}

- (IBAction)buttonSave:(id)sender {
  class2 *Obj = [[class2 alloc] init];
  [Obj addItem:self.screen.text];
}

そしてclass2 @interface

//class2.h
#import class2.h
@interface {

}

@property (strong, nonatomic) NSMutableArray *totalArray;

class2 @実装

@interface class2 ()

@end

@implementation {

}

- (void) addItem:(id)item {
  self.totalArray = [[NSMutableArray alloc] init]; //alloc & init
  [self.totalArray addObject:item]; //add object to the total array
  // NSLog(@"%@", self.totalArray); If I NSLog in within this method then everything works as expected.
}

- (void)viewDidLoad {
  [super viewDidLoad];

  NSLog(@"%@", self.totalArray); //But in here the output is null. ???

}
4

4 に答える 4

0

こんな感じで使ってみて…

- (IBAction)buttonSave:(id)sender 
    {
      class2 *Obj = [[class2 alloc] init];

      Obj.totalArray = [[NSMutableArray alloc] init]; //alloc & init
      [Obj.totalArray addObject:self.screen.text];
      NSLog(@"screen.text %@", self.screen.text); // -- check here it may be null---- 
      NSLog(@"Obj.totalArray %@", Obj.totalArray);

    }

    @interface class2 ()

    @end

    @implementation {

    }

    - (void)viewDidLoad
     {
      [super viewDidLoad];

      NSLog(@"%@", self.totalArray); //But in here the output is null. ???

    }
于 2013-10-22T07:30:29.537 に答える
0

メソッドがいつ呼び出されるかを保証することはできませんviewDidLoad...そのため、値を init メソッドに渡して、そこに設定することをお勧めしますinitWithText:(NSString*)text{}viewWillAppearそれ以外の場合viewDidAppearは、テスト目的でNSLog を呼び出してみてください。iOS 7 では、view-controller の表示が少し変更されました。

于 2013-10-22T08:23:05.517 に答える
0

viewDidLoadの後に呼び出されるinitので、配列はnilここにあります。class2 initアイテムを受け取る方法を変更してください。

// In class2
-(id) initWithStyle:(UITableViewStyle)style andItem:(id)item {
    self = [super initWithStyle:style];
    if(self) {
        self.totalArray = [[NSMutableArray alloc] init];
        [self.totalArray addObject:item];
    }
    return self;
}

addItem は次のようになります。

- (void) addItem:(id)item {
  //Just add, do not initialize again
  [self.totalArray addObject:item];
}

class1 のボタン アクションは次のようになります。

- (IBAction)buttonSave:(id)sender {
    class2 *Obj = [[class2 alloc] initWithItem:self.screen.text];
    //OR
    //class2 *Obj = [[class2 alloc] initWithItem:UITableViewStylePlain andItem:self.screen.text];
}

それが役立つことを願っています!

于 2013-10-22T07:32:56.047 に答える
0

あなたの問題は、別のclass2オブジェクトを使用していることだと思います。buttonSave で初期化したものは、表示しているものではありません

class1.h にプロパティを追加します

@property (nonatomic, strong) NSMutableArray *savedArray;

そして buttonSave を変更します:

- (IBAction)buttonSave:(id)sender {
      self.savedArray = [[NSMutableArray alloc] init];
      [self.savedArray addObject:self.screen.text];
} 

ストーリーボードを使用している場合は、これを class1.h に追加class2Segueして、ストーリーボードのこのセグエに識別子を追加してください:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([segue.identifier isEqualToString:@"class2Segue"]) 
    {
        Class2 *tableController = (Class2 *)[segue destinationViewController];
        tableController.totalArray = self.savedArray;
    }
}
于 2013-10-22T08:18:56.800 に答える