在prepareForSeque中委托不是nil,在导航表视图中调用时为nil

时间:2015-02-05 03:23:55

标签: ios objective-c uitableview delegates

我有一个我在导航控制器中创建的具有表视图的委托。当我从MainViewController传递数据时(我已将其设置为委托,并实现了委托方法),我通过prepareForSegue完成。看起来像这样:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"loadFavorites"]) {
        FavoritesTableViewController *favoriteTableViewcontroller = segue.destinationViewController;
        favoriteTableViewcontroller.delegate = self;
    }
}

在同一个MainViewcontroller类中,我在.h文件中执行此操作:

@interface MainViewController : UITableView <UITextFieldDelegate, FavoriteTableViewControllerDelegate>

我还在FavoriteTableViewController类中声明了以下内容:

@class FavoritesTableViewController;

@protocol FavoriteTableViewControllerDelegate <NSObject>
- (void)favoriteTableViewController:(FavoritesTableViewController *)controller didSelectItem:(NSString *) item;
@end

@interface FavoritesTableViewController : UITableViewController

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

@end

我在MainViewController中实现了协议:

- (void)favoriteTableViewController:(FavoritesTableViewController *)controller didSelectItem:(NSString *)item
{
    self.item.text = [stop substringToIndex:5];

    [self dismissViewControllerAnimated:YES completion:nil];
}

Everything编译,我可以看到委托被设置。但是,当在tableView委托中调用该方法时:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    selectedIndex = indexPath.row;
    NSString *key = favorites[indexPath.row];
    NSString *item = [[FavoritesData getAllFavoriteItems] objectForKey:key];

    [self.delegate favoriteTableViewController:self didSelectItem:item];
}

委托设置为0x0或nil。这意味着它不会回调MainViewController类来执行代码。我还在代表团工作一周。我知道它是如何工作的,但是当它没有时,我通常会有点失落。我做错了什么?

顺便说一下,在storyboard中,NavigationController中有一个TableViewController,它将类设置为FavoriteTableViewController。这一切都很好,因为我使用NSUserDefaults将数据传递给模态视图。我现在要做的就是选择数据,关闭视图,并将数据设置为主视图。

2 个答案:

答案 0 :(得分:0)

您的MainViewController是否也嵌入在导航控制器中?

如果没有,它可能会在委托方法调用之前被解除分配。

尝试暂时将代理设置为强大,看看这是否有所作为。不要忘记将其改回弱势以避免之后的潜在保留周期。

答案 1 :(得分:0)

如果您正在使用导航控制器,则必须先获取导航。但是,如果您设置了委托,它应该已经崩溃。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"loadFavorites"]) {
        UINavigationController *navController = segue.destinationViewController;

        FavoritesTableViewController *favoriteTableViewcontroller = navController.childViewControllers[0];
        favoriteTableViewcontroller.delegate = self;
    }
}