2012-02-17 73 views
0

我正在研究一個有購物車的應用程序。當我在購物車中添加產品時,我的按鈕以模態方式延伸到桌面視圖控制器。然後當我選擇一行時,模態視圖控制器應該被解除。我試圖用我的代表實現這一點。這裏是我的代碼:我的代理不起作用

(省略不相關的代碼)

ItemsTableViewController(產品清單以供選擇)

//the header file 
@class ItemsTableViewController; 

@protocol ItemsTableViewControllerDelegate <NSObject> 

- (void) itemsTableViewController: (ItemsTableViewController *)sender 
       didSelectProduct: (Product *) aProduct; 

@end 

@interface ItemsTableViewController : CoreDataTableViewController 

@property (nonatomic, strong) UIManagedDocument *itemDatabase; 

@property (nonatomic, weak) id <ItemsTableViewControllerDelegate> delegate; 

@end 

//從實現

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    Product *item = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    [self.delegate itemsTableViewController:self didSelectProduct:item]; 
    NSLog(@"DID SELECT ROW AT index %d with name %@", indexPath.row, item.name); 

} 

//這裏的代碼片段我的購物車,ItemsTableViewController代理

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([segue.identifier isEqualToString:@"Show Products List"]){ 
     ItemsTableViewController *itemsTVC = (ItemsTableViewController *)segue.destinationViewController; 
     itemsTVC.delegate = self; 

    } 
} 
- (void) itemsTableViewController:(ItemsTableViewController *)sender didSelectProduct:(Product *)aProduct{ 
    //adds the product in the shopping cart 
    [self.shoppingCart addObject:aProduct]; 
    [self.products reloadData]; 
    [self dismissModalViewControllerAnimated:YES]; 
    NSLog(@"from the delegate got product %@", aProduct.name); 
} 
+0

當你運行它時究竟發生了什麼?你還在哪裏調用了'NSLog'(或斷點)來確保你的變量被正確地賦值,並且你的方法被調用(或者沒有被調用)?你的日誌輸出是什麼? – 2012-02-17 06:22:51

+0

它記錄了一行被選中並且該項目被識別,但是從委託的一部分它不記錄NSLog(@「從代理獲得產品%@」,aProduct.name); – acecapades 2012-02-17 06:23:58

+0

你的代表是否有弱點? – 2012-02-17 13:02:45

回答

1

你的segue的目標是一個UINavigationController,而不是一個ItemsTableViewController。也許你把你的ItemsTableViewController放在故事板上的UINavigationController中。試試這個:

UINavigationController *navController = segue.destinationViewController; 
ItemsTableViewController *itemsTVC = (ItemsTableViewController *)navController.topViewController; 
itemsTVC.delegate = self; 
+0

我改變了我的答案。 – 2012-02-17 06:41:50

+0

如果將代理設置爲強不能解決問題,那麼其他事情正在進行。無論是'tableView:didSelectRowAtIndexPath:'是否發送到'ItemsTableViewController'的不同實例,而不是您在'prepareForSegue:sender:'中訪問的實例,或者將其設置爲'prepareForSegue:sender:'後設置爲無。 。 – 2012-02-17 06:54:29

+0

我該如何檢查tableView:didSelectRowAtIndexPath:是否被髮送到正確的實例? – acecapades 2012-02-17 08:22:13