【问题标题】:My delegate doesn't work我的代表不工作
【发布时间】:2012-02-19 17:35:00
【问题描述】:

我正在开发一个有购物车的应用。当我在购物车中添加产品时,我的按钮会模态地连接到表格视图控制器。然后当我选择一行时,模式视图控制器应该被关闭。我尝试使用我的委托来实现这一点。这是我的代码:

(无关代码省略)

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

//来自实现的sn-ps

- (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);
}

【问题讨论】:

  • 运行它时实际发生了什么?你还在哪里调用NSLog(或断点)来确保你的变量被正确分配并且你的方法被调用(或不被调用)?您的日志记录的输出是什么?
  • 它记录了一行被选中并且项目被识别但是从代理的部分它没有记录 NSLog(@"from the delegate got product %@", aProduct.name);跨度>
  • 你的代表软弱有什么原因吗?
  • 所有代表都应该是弱@rokjarc
  • 不应该是 __unsafe_unretained 与 ARC 一起使用吗?即:stackoverflow.com/questions/7753841/…

标签: iphone objective-c delegates


【解决方案1】:

segue 的目标是 UINavigationController,而不是 ItemsTableViewController。也许您将 ItemsTableViewController 放在故事板上的 UINavigationController 中。试试这个:

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

【讨论】:

  • 如果将代理设置为强并没有解决问题,那么还有其他事情发生。 tableView:didSelectRowAtIndexPath: 被发送到与您在 prepareForSegue:sender: 中访问的实例不同的 ItemsTableViewController 实例,或者在您在 prepareForSegue:sender: 中设置委托后将其设置为 nil。
  • 如何检查 tableView:didSelectRowAtIndexPath: 是否发送到正确的实例?
  • 但我这样设置destinationViewController:ItemsTableViewController *itemsTVC = (ItemsTableViewController *)segue.destinationViewController; itemsTVC.delegate = self;所以我认为 tableView: didSelectRowAtIndexPath: 被发送到那个实例。那么我将如何检查将其设置为 nil 的内容?
  • 您可以使用%p 格式记录itemsTVC,然后在tableView:didSelectRowAtIndexPath: 中使用%p 记录self,并确保您看到相同的值。
  • 你可以尝试在-[ItemsTableViewController setDelegate:]上设置断点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2018-08-11
  • 1970-01-01
相关资源
最近更新 更多