2014-12-01 139 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

相關問題