我在iPhone应用程序中有表格视图。要求是我必须对该表视图使用手势,以便当用户点击+保持一行时,会出现一个对话框,确认用户将该特定行的数据保存到iPhone核心数据或nsuserdefaults。
我想知道最好保存数据的选项,即核心数据还是nsuserdefaults?
最重要的我怎样才能实现它?
我需要任何示例或代码段来完成此操作...
thanx
答案 0 :(得分:3)
在我看来
少量数据:NSUserDefaults
中等金额:plists
大量:CoreData,sqlite
首先,我们来看看直接使用SQLite。
现在核心数据:
现在真正的问题是,哪个更容易使用?那么,这真的取决于你在做什么。在我最近创建的应用程序中,我所要做的就是从SQLite数据库中按顺序读取少量数据,因为这是一个非常简单的任务,我只是将FMDB与iPhone SQLite一起使用。现在,如果我需要对数据做任何事情而不是阅读它,Core Data可以使这一切变得更加容易,我建议使用它。
结论:核心数据让这么多事情变得如此简单,我建议使用它,除非你已经有了现有代码,或者只做了最基本的数据库使用
这是一些教程的列表
答案 1 :(得分:0)
我认为如果我们谈论真的很多日期,你最好使用核心数据。如果您只需要存储非常少的信息,例如用户设置或类似NSUserDefaults
的信息,那就是正确的方法。
如何实现:
你是一个NSTimer作为aproperty,我只是称之为yourTimer
在带有tableView的ViewController中,您需要实现以下方法:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
[yourTimer invalidate];
yourTimer = nil;
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
[yourTimer invalidate];
yourTimer = nil;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint *currentPosition = [touch locationInView:self.view];
//here you have to check if the touch is inside the cell you wanted
//note that this code wont work, you have to personalize it, this is only a hint
if ([currentPosition isInsideYourCell]){
if (!yourTimer.isValid) {
// NSLog(@"testausgabe");
yourTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 //any interval you like
target:self
selector:@selector(onTick:)
userInfo:nil repeats: YES];
[yourTimer fire];
}
}
}
- (BOOL)isInsideYourCell{
//check if the touch is inside the cell
}
- (void)onTick:(NSTimer *)timer {
if (timer.timeInterval >= 2.0){
//lets say your dialogue will appear after 2 secconds
[self displayYourDialogue];
}
}
我希望你能得到这个帮助。
答案 2 :(得分:0)
如果我确定不会超过10-20行数据,我会选择NSUserDefault,否则我会选择CoreData,以便将来可以扩展。我将在单元格中使用LongPressGestureRecognizer来获取单元格的indexPath并显示对话框,如下面的示例代码所示。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
UILongPressGestureRecognizer *pressRecongnizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tableCellPressed:)];
pressRecongnizer.minimumPressDuration = 0.5f;
[cell addGestureRecognizer:pressRecongnizer];
[pressRecongnizer release];
}
// your cell info
cell.textLabel.text = @"test";
return cell;
}
- (void)tableCellPressed:(UILongPressGestureRecognizer *)recognizer
{
// You can access to the tableview cell from the recognizer.view
// You can get the data directly from the cell data more or label and etc.
UITableViewCell *cell = (UITableViewCell *)recognizer.view;
// You can either get the NSIndexPath of the cell from the tableview to
// access the data model from you data collection.
NSIndexPath *indexPath = [self.tableview indexPathForCell:cell]
// Use the index path to get data and display dialog.
// For example:
UIAlertView *alert = [UIAlertView alloc] – initWithTitle:@"table cell pressed" message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}