问题添加到NSMutableArray

时间:2017-08-23 03:47:30

标签: objective-c nsmutablearray

对于那些经历过这个问题但还没有发现任何相关内容的人来说,我已经到处看了所以我觉得我自己也会问这个问题......

我有一个自定义对象(HitterData),我将用它来填充UITableView中的单元格,然后是两个ViewControllers(一个是hitterTableViewController,另一个是"详细信息"视图控制器标记为" AddPlayerViewController& #34;。)

问题是我可以将HitterData对象添加到表VC中的NSMutableArray中,但只有一个,然后当我使用详细视图控制器添加另一个时,Mutable数组被重新初始化"而且我一次只能有一个物体。

HitterObject:

@implementation HitterData.m

@synthesize hitterName = _hitterName;
@synthesize position = _position;

-(id)initWIthNameAndPosition:(NSString *)hitterName position:(NSString *)position {
    if ((self = [super init])) {
        self.hitterName = _hitterName;
        self.position = _position;
    }
    return self;
}

HitterTableViewController.h

#import "HitterData.h"
#import "HitterDoc.h"
#import "AddPlayerViewController.h"

@interface HitterTableViewController : UITableViewController

@property (nonatomic, strong) NSMutableArray *hitters;
- (IBAction)backButton:(id)sender;
- (IBAction)addPlayerView:(id)sender;

-(void)addHitterObject:(HitterData *)hitter;

HitterTableViewController.m(仅与使其更具可读性相关)

@implementation HitterTableViewController

@synthesize hitters = _hitters;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.hitters = [NSMutableArray array];
}

-(void)addHitterObject:(HitterData *)hitter {
    if(_hitters != nil) {
        [_hitters addObject:hitter];
    } else {
        _hitters = [NSMutableArray array];

        [_hitters addObject:hitter];
        NSLog(@"MutableArray is not valid");
    }

}

AddPlayerViewController.h

@interface AddPlayerViewController : UIViewController <UITextFieldDelegate, UINavigationControllerDelegate>

@property (weak, nonatomic) IBOutlet UITextField *nameTextField;
@property (weak, nonatomic) IBOutlet UITextField *positionTextField;

@property (nonatomic) HitterTableViewController *hitterTable;
@property (nonatomic) NSString *hitterName;
@property (nonatomic) NSString *position;

//-(void)addNewHitterToHittersArray:(HitterData *)hitter;

- (IBAction)addPlayerToRoster:(id)sender;

AddPlayerViewController.m

@implementation AddPlayerViewController

@synthesize hitterTable;

- (void)viewDidLoad {
    [super viewDidLoad];
    hitterTable = [[HitterTableViewController alloc] init];
}
- (IBAction)addPlayerToRoster:(id)sender {
    self.hitterName = [self.nameTextField text];
    self.position  = [self.positionTextField text];

    HitterData *hitter = [[HitterData alloc] init];
    hitter.hitterName = self.hitterName;
    hitter.position = self.position;

    [hitterTable addHitterObject:hitter];

    ArraySingleton *arrayS = [[ArraySingleton alloc] init];
    [arrayS initializeArray];
    [arrayS addToHittersArray:hitter];

    if (arrayS) {
        NSLog(@"arrayS exists in AddPlayerVC");
    } else {
        NSLog(@"arrayS does not exist");

    }

    [self performSegueWithIdentifier:@"backToTeamTableViewController" sender:self];
}

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:0)

AddPlayerViewController应该对HitterTableViewController一无所知,使用委托方法返回新的HitterData对象。

- (IBAction)addPlayerToRoster:(id)sender
{
    Hitter *hitter = [[Hitter alloc] init];
    hitter.name = [self.nameTextField text];
    hitter.position  = [self.positionTextField text]; 

    [self.delegate didAddHitter:hitter];
}

然后回到HitterTableViewController

- (void)didAddHitter:(Hitter *)hitter
{
    [self.hitters addHitter:hitter];
    [self dismissViewControllerAnimated:YES completion:nil];
}

答案 1 :(得分:0)

根据显示的代码猜测:

每次您想要添加播放器时,您似乎都会创建新的AddPlayerView / AddPlayerViewController。反过来,控制器在其viewDidLoad中创建一个 HitterTableViewController - 当然它有自己的空数组。代码应该引用现有的HitterTableViewController

BTW:常见的设计模式是MVC - 模型,视图,控制器 - 考虑您是否处于当前状态,因为您已将模型的一部分(数组)存储在控制器中,并且两个控制器都应该引用包含该数组的公共共享模型对象。

BTW:所有这些@synthesise语句都是不需要的。在现代的Obj-C中,合成是自动的,你很少需要这些陈述。此外,通常建议不要直接使用属性支持变量,当存储到属性时肯定不会,因为这会破坏KVO。 (在HitterData.m中似乎也有相关的拼写错误,但由于你没有报告它不起作用,它可能只是你问题中的拼写而不是代码。)

HTH