2013-06-19 4 views
0

Я использую следующее создать ссылку на контроллер представления в моем коде, как это:ошибка кодирования Значения ключа при использовании prepareForSegue

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([segue.identifier isEqualToString:@"detailSegue"]){ 
    NSIndexPath *indexPath=[self.tableView indexPathForSelectedRow]; 
    TRDetailViewController *vc=segue.destinationViewController; 
    vc.item=self.items[indexPath.row]; 
    [vc setValue:self forKeyPath:@"delegate"]; 
    [vc setValue:indexPath.row forKeyPath:@"itemIndex"]; 
    } 
} 

и это объявляются как в TRDetailViewController

@interface TRDetailViewController : UIViewController 
    @property (weak, nonatomic) IBOutlet UILabel *detailLabel; 
    @property NSString *item; 
    @property (nonatomic, weak)id delegate; 
    @property NSInteger itemIndex; 
    - (IBAction)deleteItem:(id)sender; 
@end 

но я получаю следующую ошибку

enter image description here

, и я не уверен, почему. Я пытаюсь передать местоположение в индекс ячейки, выбранной в UITableView. Если лучший способ, пожалуйста, дайте мне знать. Почему я получаю эту ошибку?

ТНХ

+0

ТНХ для редактирования - был кто-то разговаривает со мной – timpone

+0

Sure! FWIW, я обнаружил, что я делаю меньше ошибок, когда предпочитаю объектные свойства c для кодирования ключа. Например, если вы импортировали класс и пытаетесь присвоить значение этому классу, который не отображается, компилятор сообщает вам. Вы не понимаете, что при использовании строковой строки keyPaths setValue: forKeyPath: принимает. – geraldWilliam

ответ

1

SetValue: forKey: ожидает объект для его значения аргумента и вы передаете это примитивный (в этом case, целое число). Вы можете обойти эту проблему путем внесения изменений в свой метод следующим образом:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([segue.identifier isEqualToString:@"detailSegue"]){ 
    NSIndexPath *indexPath=[self.tableView indexPathForSelectedRow]; 
    TRDetailViewController *vc=segue.destinationViewController; 
    vc.item=self.items[indexPath.row]; 
    [vc setValue:self forKeyPath:@"delegate"]; 
    [vc setValue:[NSNumber numberWithInt:indexPath.row] forKeyPath:@"itemIndex"]; 
    } 
} 

И обращаться к нему как:

[[vc valueForKey:@"itemIndex"] intValue]; 
1

setValue:forKeyPath: требует объект (т.е. id) в качестве первого аргумента.

Вы вместо этого передаете NSInteger.

Вам необходимо будет использовать тип объекта, что означает превратить ваш itemIndex в NSNumber.

Затем вы можете сохранить его с помощью

[vc setValue:@(indexPath.row) forKeyPath:@"itemIndex"]; 

и получить его

NSInteger myIndex = [vc valueForKey:@"itemIndex"].integerValue;