2017-08-23 52 views
0

我到处都找过谁经历了这个问题,但还没有找到任何有关的人的地方,所以我认为我会问我自己...发行增加的NSMutableArray

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

问题是,我可以将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]; 
} 

我在这里失去了一些东西?

+0

请显示来自tableviewcontroller赛格瑞的代码detailviewcontroller – 3stud1ant3

+0

- (IBAction为)addPlayerView:(ID)发送方{ [自performSegueWithIdentifier:@ “addPlayerSegue” 发件人:自]; } – shalom2you

+0

我用了一个storyboard segue,标识符为“addPlayerSegue” – shalom2you

回答

0

猜测仅仅基于所示的代码:

你希望像你创建一个新的AddPlayerView/AddPlayerViewController增加一个玩家,它看起来每次。反过来,该控制器在其viewDidLoad中创建了一个新的 HitterTableViewController - 这当然有它自己的空阵列。代码应该引用现有的HitterTableViewController

BTW:常见的设计模式是MVC - 模型,视图,控制器 - 考虑你是否在你目前的情况,因为你已经存储模型,该阵列的一部分,在你的控制器,也许两个控制器应该引用一个包含该数组的普通共享模型对象。

顺便说一句:所有这些@synthesise陈述是不需要的。在现代的Obj-C综合中是自动的,你很少需要这些语句。此外,通常建议不要直接使用属性备份变量,当存储到属性中时肯定不会使用该属性,因为这会打破KVO。 (在HitterData.m中似乎也有一个相关的输入错误,但是因为您没有报告不工作,所以可能只是您的问题而不是代码中的错字。)

HTH

+0

当你说它应该引用现有的HTVC时,你在代码中意味着什么?我对Obj-c仍然很陌生,对不起,因为无知 – shalom2you

+0

而不是'[[HitterTableViewController alloc] init]'你需要访问你分配的第一个控制器,而不是继续创建新的控制器。您如何做到这一点取决于您的应用程序的体系结构。如果你遵循MVC,你应该设计一个模型类来封装你的数组(以及你需要的其他数据)。然后通过给类提供一个*类方法*来创建该类的单个实例,通常称为'sharedInstance',该方法将ref返回给您的应用程序共享的单个实例。查阅这些条款,你会找到解释和样本。类如“NSFileManger”遵循此模型。 – CRD

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]; 
} 
+0

如何在AddPlayer类上实现委托?我需要在任何地方声明吗? – shalom2you

+0

只是谷歌它,代表团是基本的东西 – trapper

+0

好吧,你知道任何好的链接解释? – shalom2you