添加到 NSMutableArray 的问题

Issue adding to NSMutableArray

我找遍了所有遇到过此问题但尚未找到任何相关内容的人,所以我想我自己问一下...

我有一个自定义对象 (HitterData),我将使用它来填充 UITableView 中的单元格,然后是两个 ViewControllers(一个是 hitterTableViewController,另一个是 "detail" 视图控制器,标签为 "AddPlayerViewController")。

问题是我可以将 HitterData 对象添加到我的 Table VC 中的 NSMutableArray,但只有一个,然后当我使用详细视图控制器添加另一个对象时,Mutable 数组是 "reinitialized" 并且我一次只能有一个对象。

击球手对象:

@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];
}

我是不是遗漏了什么?

AddPlayerViewController 应该对 HitterTableViewController、return 具有委托方法的新 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];
}

根据显示的代码猜测:

每次您希望添加一名球员时,您似乎都在创建一个新的 AddPlayerView/AddPlayerViewController。反过来,该控制器在其 viewDidLoad 中创建一个 new HitterTableViewController - 当然它有自己的空数组。该代码应该改为引用现有的 HitterTableViewController.

顺便说一句:常见的设计模式是 MVC - model、view、controller - 考虑一下你现在的情况是不是因为你存储了模型的一部分,数组,在你的控制器中,也许两个控制器都应该引用一个包含该数组的公共共享模型对象。

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

HTH