添加到 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
我找遍了所有遇到过此问题但尚未找到任何相关内容的人,所以我想我自己问一下...
我有一个自定义对象 (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