2014-12-01 138 views
0

我在tableView的单元格内有M13Checkbox。当用户检测开关此复选框我想保存在核心数据中的某些数据获取tableview行的indexpath

- (IBAction)completed:(M13Checkbox *)sender { 


    NSDate *now = [NSDate date]; 
    NSNumber *yes = [NSNumber numberWithBool:YES]; 

    NSManagedObjectContext *context = [self managedObjectContext]; 

    NSManagedObject *selectedHabit = [self.habits objectAtIndex:[[self.tableView indexPathForSelectedRow] row]]; 
    self.habit = selectedHabit; 

    NSNumber *habitID = [self.habit valueForKey:@"habitID"]; 

    NSNumber *habitRepeats = [self.habit valueForKey:@"habitRepeats"]; 

    //getting number of habit reoeats for Smart habits function 
    int i = [habitRepeats intValue] + 1; 
    NSNumber *repeats = [NSNumber numberWithInt:i]; 
    [self.habit setValue:repeats forKey:@"habitRepeats"]; 

    //saving completion to core data 
    NSManagedObject *habitForDate = [NSEntityDescription insertNewObjectForEntityForName:@"HabitForDate" inManagedObjectContext:context]; 
    [habitForDate setValue:now forKey:@"date"]; 
    [habitForDate setValue:habitID forKey:@"habitID"]; 
    [habitForDate setValue:yes forKey:@"completed"]; 

    [context deleteObject:habitForDate]; 

    NSError *error = nil; 
    if (![context save:&error]) { 
     NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
    } 

Althoug在tableview中的习惯已经为关键“habitID”不同的值,habitForDate总是收到
“1”作为“habitID”价值我认为这个问题在代码的下面部分,我得到错误的索引

NSManagedObject *selectedHabit = [self.habits objectAtIndex:[[self.tableView indexPathForSelectedRow] row]]; 
    self.habit = selectedHabit; 

我的问题是,如何让这些复选框cliked

+1

有人倒我的投票以下完全没有答案,但一到做一套最简单的方法就是使用标签。 checkbox.tag = indexPath.row,稍后在您的处理程序代码中,您可以根据您的复选框标记构建indexPath。 – Puran 2014-12-01 19:49:59

+0

我认为你可以在cellForRowAtIndexPath委托中的M13Checkbox中设置属性,例如'yourcheckbox.tag = indexPath.row',当你调用函数 - 获取正确的编号。 – 2014-12-02 00:19:34

+0

该方法的工作,谢谢:) – Czarek 2014-12-02 16:22:11

回答

-1

一个我做的方式细胞的indexPath是使用类的UIView + Data.h并附加额外的数据片段。

#import "UIView+Data.h" 
#import <objc/runtime.h> 

const char * const viewUserDataKey = "view.userData"; 
@implementation UIView (Data) 
- (id)userData { 
    return objc_getAssociatedObject(self, viewUserDataKey); 
} 

- (void)setUserData:(id)userData { 
    objc_setAssociatedObject(self, viewUserDataKey, userData, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
@end 

此外,在头文件中有一个属性,@property (nonatomic, strong) id userData;

您可以将以上类别导入到您的课程中,并将indexPath附加到单元格内的复选框checkBox.userData = indexPath我不确定它是否是完美的方式,但是我的应用程序已在App Store中运行并且工作正常!

而且,在你的方法,你可以读回indexPath作为

- (IBAction)completed:(M13Checkbox *)sender { 
    NSIndexPath *indexPath = (NSIndexPath*)sender.userData; 
} 
+1

这是违反MVC。 – vikingosegundo 2014-12-01 19:58:29

0
- (IBAction)completed:(M13Checkbox *)sender { 
    UITableViewCell * cell = [[sender superView] superView]; // if you added it to cell's content view. 
    NSIndexPath *indexPath = [self.tableview indexPathForCell:cell]; 

    .... 
} 
+0

谨慎解释? (LQRQ) – 2014-12-01 21:00:33

+1

这将工作,但是很脆弱,因为它依赖于UITableViewCell的层次结构保持不变。 – 2014-12-01 21:08:25

+0

事实上,使用具有属性的自定义表格视图对控件更好。 – vikingosegundo 2014-12-01 21:34:21

相关问题