修改另一个类中的nsmutablearray

时间:2013-06-04 10:05:07

标签: ios objective-c class uitableview nsmutablearray

我在managerViewController中有一个NSMutableArray七个bool,这些代表商店开放时的星期几。我在这个视图中空间不足,大多数时候用户会对所有小时打开的默认设置感到满意。

用户需要能够根据他们的业务需求进行更改,我目前的方法是拥有七行的uitableview,其中所有行都有开关。我被困的地方是如何在uitableview中修改manageViewController类中的原始nsmuntable数组。

我是iOS新手,但我已经构建了UITableView和所有其他位,只是访问NSMutableArray我被困住了。

4 个答案:

答案 0 :(得分:0)

使用replaceObjectAtIndex:withObject:或者,使用新的objective-c文字更容易:

NSMutableArray *myArray = [NSMutableArray array];
myArray[0] = @(YES); // the same as: [myArray addObject:[NSNumber numberWithBool:YES]];
myArray[0] = @(NO); // the same as: [myArray replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:YES]];

答案 1 :(得分:0)

定义表视图控制器的委托,比如说TableViewControllerDelegate。将委托属性添加到表视图控制器     @property(弱,非原子)id委托;

让您的ManagerViewController符合代理协议,并在显示TableViewController后,将其代理设置为您的ManagerViewController实例。

在委托中添加方法以通知一天中的操作,例如:

- (void) didModifyDay:(NSInteger)dayNumber;

- (void) didChangeDay:(NSInteger)dayNumber toState:(BOOL)selected;

答案 2 :(得分:0)

中加载表格视图时
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

确保检查数据源(可变数组)中所有开关和设置值的初始值。为了轻松处理这种情况,请使用自定义并将其对象放入数组中。

@interface Days : NSObject
@property (nonatomic, retain) NSString *day;
@property (nonatomic, assign) BOOL isOpen;
@end

即。

for(int ii = 0; ii < 7; ii++ ){
    Days *days = [[Days alloc] initWithDay:ii isOpen:YES];
    [array addObject:days];
    [days release];  
}

假设您有一个自定义UITableViewCell,其属性设置为交换机。 我正在使用cell.switch。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"reusableCells";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
   if(cell == nil)
       cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

    Days *days = [array objectAtIndex:indexPath.row];
    cell.textLabel.text = days.day;
    [cell.switch setOn:days.isOpen animated:YES];

    return cell;
}

这会处理你的开关。 现在假设您按下表格单元格时打开/关闭开关,以便处理tableview委托的didSelectRowAtIndexPath方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    Days *days = [array objectAtIndex:indexPath.row];
    days.isOpen != days.isOpen;
    [cell.switch setOn:days.isOpen animated:YES];
}

这就是全部。您将打开/关闭开关切换,并将从阵列中操作。

答案 3 :(得分:0)

您可以使用应用程序的app delegate类来访问NSMutableArray。

在app delegate类中为该NSMutableArray所在的类创建属性,例如,类名是TestController。

//then in .h file of Appdelegate

#import TestController.h

//in the interface 

TestController *objTest;

//declare the property
@property (nonatomic, strong) TestController *objTest;


//then in the .m file of app delegate synthesize the object
@synthesize objTest;

现在以类似的方式在TestController中声明NSMutableArray的属性

创建要在其中访问NSMutable数组对象(例如arr1)的app delegate类的共享实例,如下所示

AppDelegate *objAppDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

您可以将该数组作为“objAppDelegate.objTest.arr1”

进行访问

您可以在视图控制器类

中创建共享实例
//in the .h of view controller
+ (id)sharedInstance;

//in the .m of view controller

+ (id)sharedInstance
{
    // structure used to test whether the block has completed or not
    static dispatch_once_t p = 0;

    // initialize sharedObject as nil (first call only)
    __strong static id _sharedObject = nil;

    // executes a block object once and only once for the lifetime of an application
    dispatch_once(&p, ^{
        _sharedObject = [[self alloc] init];
    });


    // returns the same object each time
    return _sharedObject;
}

然后在填充数组的应用程序中使用

TestViewController *objTest=[TestViewController sharedInstance];
objTest.arr1=[[NSMutableArray alloc]initWithObjects:@"1",@"1",@"1",@"1", nil];

在表视图控制器中,您可以按如下方式访问它

TestViewController *objTest=[TestViewController sharedInstance];

objTest.arr1将是结果数组。