一般菜鸟问题:
(1)如何在NSMutable
操作中创建buttonClicked
数组,以便在后续点击同一按钮时添加更多条目?我似乎总是在每次点击时重新开始一个新数组(数组只打印一个条目,这是NSLog
语句中最新的按钮标记。)
我的代码中有一个for循环生成的大约100个按钮(我的字符串中每个字符一个称为“list”),每个按钮都分配了一个标记。它们位于我ViewController
视图内的滚动视图中。
我希望跟踪点击了多少(以及哪些)按钮,并选择如果再次点击这些条目,则删除这些条目 。
这是我到目前为止所做的:
-(void) buttonClicked:(UIButton *)sender
NSMutableArray * theseButtonsHaveBeenClicked = [[NSMutableArray alloc] initWithCapacity: list.length];
NSNumber *sendNum = [NSNumber numberWithInt:sender.tag];
[theseButtonsHaveBeenClicked addObject:sendNum at index:sender.tag];
NSLog(@"%@",theseButtonsHaveBeenClicked);
}
(2)我已经读过我可以使用plist字典,但我真的不明白我将如何在代码中实现这一点,因为我无法手动输入字典中的项目(因为我没有知道用户将点击哪些按钮)。如果我以某种方式加载并替换plist文件中的字典,这会更容易吗?我该怎么做?
(3)我也不知道我应该如何管理内存,因为我需要不断更新数组。 autorelease
?
感谢您提供的任何帮助!
答案 0 :(得分:3)
好的,首先你要创建一个本地范围的数组,每次调用 buttonClicked:时都会重新初始化。该变量应该是类init循环的一部分。
使用 NSMutableDictionary 而不是NSMutableArray也会更好。使用字典我们不必指定容量,我们可以使用按钮的标签作为字典键。
以下是您需要做的事情,这三个步骤总是在一起: property / synthesize / release 。一个值得记住的好人。
//Add property declaration to .h file
@property (nonatomic, retain) NSMutableDictionary * theseButtonsHaveBeenClicked;
//Add the synthesize directive to the top of .m file
@synthesize theseButtonsHaveBeenClicked;
// Add release call to the dealloc method at the bottom of .m file
- (void) dealloc {
self.theseButtonsHaveBeenClicked = nil; // syntactically equiv to [theseButtonsHaveBeenClicked release] but also nulls the pointer
[super dealloc];
}
接下来,我们在初始化类实例时创建一个存储对象。将其添加到您班级的 init 或 viewDidLoad 方法。
self.theseButtonsHaveBeenClicked = [[NSMutableDictionary alloc] dictionary]; // convenience method for creating a dictionary
您更新的 buttonClicked:方法应该更像这样。
-(void) buttonClicked:(UIButton *)sender {
NSNumber *senderTagAsNum = [NSNumber numberWithInt:sender.tag];
NSString *senderTagAsString = [[NSString alloc] initWithFormat:@"%@",senderTagAsNum];
// this block adds to dict on first click, removes if already in dict
if(![self.theseButtonsHaveBeenClicked objectForKey:senderTagAsString]) {
[self.theseButtonsHaveBeenClicked setValue:senderTagAsNum forKey:senderTagAsString];
} else {
[self.theseButtonsHaveBeenClicked removeObjectForKey:senderTagAsString]; }
[senderTagAsString release];
NSLog(@"%@", self.theseButtonsHaveBeenClicked);
}