将NSMutableArray添加到项目&在另一个类中访问相同的NSMutableArray

时间:2015-09-24 20:48:33

标签: ios objective-c iphone xcode nsmutablearray

我在尝试将NSMutableArray字符串分享给另一个班级时遇到了一些麻烦。我有一个填充了tableView的{​​{1}},我想将其添加到Strings。然后在另一个NSMutableArray

中使用该SAME NSMutableArray

我创建了一个子类为ViewController

的类

·H

NSMutableArray

的.m

#import <Foundation/Foundation.h>

@interface HYServicesMArray : NSMutableArray

@property (nonatomic, weak)NSMutableArray * arrServicesUserChoice;


@end

我正在尝试从#import "HYServicesMArray.h" @implementation HYServicesMArray @dynamic arrServicesUserChoice; @end

向此NSMutableArray添加元素

的.m

tableView didSelectRowAtIndexPath:

enter image description here

我怎么也无法向- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark; UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; NSLog(@"You have selected: %@",cell.textLabel.text); // add cell.textLabel.text to arrServicesUserChoice // Tried the code below but causes my app to crash arrServicesUserChoice = [[NSMutableArray alloc]init]; [arrServicesUserChoice addObject:cell.textLabel.text]; } 添加元素。我被困了请求帮助!先感谢您!

6 个答案:

答案 0 :(得分:1)

你声明了一个可变数组,你用来添加的代码返回一个数组,但是它不添加任何数据。你必须添加像:

这样的对象
     [arrAvaialbleServicesList addObject:cell.textlabel.text];

在此之后,您的可变数组将具有添加的数据

或者你可以声明另一个数组,并按照你的方式“

 NSArray *test=[arrAvaialbleServicesList arrayByAddingObject:cell.textLabel.text];

之后,新数组将为数组添加数据。

答案 1 :(得分:1)

我认为你应该改变

@dynamic arrServicesUserChoice;

@synthesize arrServicesUserChoice;

答案 2 :(得分:0)

MutableArray的原始初始化没有做任何事情,也没有将arrAvalabelServiceList指定为Mutable - arrayByAddingObject创建一个全新的实例NSArray,而不是NSMutableArray

  arrAvaialbleServicesList = [[NSMutableArray alloc]init];
  [arrAvaialbleServicesList arrayByAddingObject:cell.textLabel.text];

但是,如果您这样做,则不会将此新实例分配给任何内容:

arrAvaialbleServicesList = [arrAvaialbleServicesList arrayByAddingObject:cell.textLabel.text];

您至少可以获得新NSArray实例的句柄。

您应该在设置表格时创建列表:

arrAvaialbleServicesList = [[NSMutableArray alloc]init];

在您的didSelect上,您只需将文本添加到列表中:

NSString *selected = [NSString stringWithString:cell.textLabel.text];

[arrAvaialbleServicesList addObject:selected];

或接近此的东西,只要你在表格中选择一行,你就会在列表中添加一些内容。

答案 3 :(得分:0)

您尝试创建的是一种公共静态var正确吗?我认为更好的方法是创建一个可以处理MutableArray对象的类。将她作为单例类进行操作是保证不创建对象的另一个实例并丢失MutableArray的好方法。这是一个示例:

HYServicesMArray.h

#import <Foundation/Foundation.h>

@interface HYServicesMArray : NSObject

@property (nonatomic, strong) NSMutableArray *arrServicesUserChoice;

+ (HYServicesMArray *) instance;

@end

HYServicesMArray.m

#import "HYServicesMArray.h"

@implementation HYServicesMArray

+ (HYServicesMArray *)instance
{
    static HYServicesMArray *_ServicesMArray = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _ServicesMArray = [[self alloc] init];
    });
    return _ServicesMArray;
}


-(id)init {
    self.arrServicesUserChoice = [[NSMutableArray alloc] init];
    return self;
}

@end

你的didSelectRowAtIndexPath方法上的应用程序:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    NSLog(@"You have selected: %@",cell.textLabel.text);

    [[HYServicesMArray instance].arrServicesUserChoice addObject:cell.textLabel.text];
}

答案 4 :(得分:0)

您应该将其设为@synthesized并将该属性取消引用为self.arrServicesUserChoice。 (你可以只在Swift中离开self。)

这应该编译:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    NSLog(@"You have selected: %@",cell.textLabel.text);

    self.arrServicesUserChoice = [[NSMutableArray alloc] init];
    [self.arrServicesUserChoice addObject:cell.textLabel.text];
}

答案 5 :(得分:0)

您无需声明@dynamic,您需要@synthesize它。如果您不想@synthesize,请使用自我。你可以在这里检查这两者之间的区别。

@synthesize vs @dynamic, what are the differences? 如果你想在另一个类中使用这个相同的数组,那么你应该在该类中声明一个属性,并使用segue将这个类的数组传递给另一个类。