prepareForSeque 时委托不为 nil,但在 Navigation Table View 中调用时委托为 nil
Delegate not nil when prepareForSeque, but nil when called in Navigation Table View
我有一个在具有 table 视图的导航控制器中创建的委托。当我从我的 MainViewController(我已将其设置为委托并实现了委托方法)传递数据时,我通过 prepareForSegue 进行操作。看起来像这样:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"loadFavorites"]) {
FavoritesTableViewController *favoriteTableViewcontroller = segue.destinationViewController;
favoriteTableViewcontroller.delegate = self;
}
}
并且在同一个 MainViewcontroller class 我在 .h 文件中这样做:
@interface MainViewController : UITableView <UITextFieldDelegate, FavoriteTableViewControllerDelegate>
我还在 FavoriteTableViewController class 中声明了以下内容:
@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];
}
一切都在编译,我可以看到正在设置委托。但是,当在此处的 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,或零。这意味着它不会回调 MainViewController class 来执行代码。我还有一周的授权时间。我知道它是如何工作的,但当它不工作时,我通常会有点迷路。我做错了什么?
顺便说一下,在故事板中,NavigationController 中有一个 TableViewController,它将 class 设置为 FavoriteTableViewController。这一切都很好,因为我正在使用 NSUserDefaults 将数据传递到模态视图。我现在要做的就是 select 数据,关闭视图,然后将数据设置到主视图。
你的MainViewController是不是也嵌入了导航控制器?
如果不是,它可能会在委托方法调用之前被释放。
尝试临时将委托设置为strong,看看这是否会产生影响。不要忘记将其改回 weak 以避免之后潜在的保留周期。
如果您要转到导航控制器,您应该首先获取导航。但是,如果您正在设置委托,它应该会崩溃。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"loadFavorites"]) {
UINavigationController *navController = segue.destinationViewController;
FavoritesTableViewController *favoriteTableViewcontroller = navController.childViewControllers[0];
favoriteTableViewcontroller.delegate = self;
}
}
我有一个在具有 table 视图的导航控制器中创建的委托。当我从我的 MainViewController(我已将其设置为委托并实现了委托方法)传递数据时,我通过 prepareForSegue 进行操作。看起来像这样:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"loadFavorites"]) {
FavoritesTableViewController *favoriteTableViewcontroller = segue.destinationViewController;
favoriteTableViewcontroller.delegate = self;
}
}
并且在同一个 MainViewcontroller class 我在 .h 文件中这样做:
@interface MainViewController : UITableView <UITextFieldDelegate, FavoriteTableViewControllerDelegate>
我还在 FavoriteTableViewController class 中声明了以下内容:
@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];
}
一切都在编译,我可以看到正在设置委托。但是,当在此处的 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,或零。这意味着它不会回调 MainViewController class 来执行代码。我还有一周的授权时间。我知道它是如何工作的,但当它不工作时,我通常会有点迷路。我做错了什么?
顺便说一下,在故事板中,NavigationController 中有一个 TableViewController,它将 class 设置为 FavoriteTableViewController。这一切都很好,因为我正在使用 NSUserDefaults 将数据传递到模态视图。我现在要做的就是 select 数据,关闭视图,然后将数据设置到主视图。
你的MainViewController是不是也嵌入了导航控制器?
如果不是,它可能会在委托方法调用之前被释放。
尝试临时将委托设置为strong,看看这是否会产生影响。不要忘记将其改回 weak 以避免之后潜在的保留周期。
如果您要转到导航控制器,您应该首先获取导航。但是,如果您正在设置委托,它应该会崩溃。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"loadFavorites"]) {
UINavigationController *navController = segue.destinationViewController;
FavoritesTableViewController *favoriteTableViewcontroller = navController.childViewControllers[0];
favoriteTableViewcontroller.delegate = self;
}
}