我在managerViewController中有一个NSMutableArray
七个bool,这些代表商店开放时的星期几。我在这个视图中空间不足,大多数时候用户会对所有小时打开的默认设置感到满意。
用户需要能够根据他们的业务需求进行更改,我目前的方法是拥有七行的uitableview,其中所有行都有开关。我被困的地方是如何在uitableview中修改manageViewController类中的原始nsmuntable数组。
我是iOS新手,但我已经构建了UITableView
和所有其他位,只是访问NSMutableArray
我被困住了。
答案 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将是结果数组。