【问题标题】:Delegate methods not being called/ChildViewController somehow ending up nil未调用委托方法/ChildViewController 以某种方式结束了 nil
【发布时间】:2023-03-04 00:25:01
【问题描述】:

我是代表团的新手,所以我一直在寻找答案,我查看了method delegates doesn't get calledDelegate method not being called,看看我的答案是否会出现。我还查看了How do I set up a simple delegate to communicate between two view controllers? 以了解代表的简要介绍,并已尽力正确地遵循它。我一直在检查我的代码,我认为我做得对,但在我的调试中,我发现我显然不是。

当用户返回父 ViewController(用户刚刚向字典中添加了一个新值)时,我想要做的是从文件“Data.plist”(存储在 Documents 目录中)重新加载一个 tableView。该应用程序在重新打开时会正确加载新输入的内容,因此我知道该文件已正确保存。

这是我的 ParentViewController.h 文件。

#import <UIKit/UIKit.h>
#import "ChildViewController.h"

@interface ParentViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource, ChildViewControllerDelegate>

@end

这是我的 ParentViewController.m 文件。

#import "ParentViewController.h"

@interface ParentViewController () 
@end

@implementation ParentViewController
-(void)addEvent {
    NSLog(@"We are before [self loadNewEvent];");
    [self loadNewEvent];
    NSLog(@"We are after [self loadNewEvent];");
}

-(void)loadNewEvent {
    [self.tableView scrollToRowAtIndexPath:0 atScrollPosition:UITableViewScrollPositionNone animated:YES];
    [self.tableView reloadRowsAtIndexPaths:0 withRowAnimation:UITableViewRowAnimationLeft];
    //[self.tableView reloadData];//This doesn't seem to do anything but leave the tableview blank when this line is in viewDidLoad and viewWillAppear.
    NSLog(@"WHY IS THIS NOT WORKING?!?!");
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //stuff that loads data initially into tableView
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //cell formatting stuff
    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"addEvent"]) {
        [(ChildViewController *)[[segue destinationViewController] topViewController] setFilePath:filePath];
        ChildViewController *detailViewController = [[ChildViewController alloc] init];
        [detailViewController setDelegate:self];
        //[self.navigationController pushViewController:detailViewController animated:YES];
    }
}
@end

这是我的 ChildViewController.h

#import <UIKit/UIKit.h>

@protocol ChildViewControllerDelegate;

@interface ChildViewController : UIViewController
@property (nonatomic, weak) id<ChildViewControllerDelegate> delegate;
- (IBAction)dismissAndSave:(id)sender;//in implementation
- (IBAction)dismissCancel:(id)sender;//in implementation
@end

@protocol ChildViewControllerDelegate <NSObject>
-(void)addEvent;
@end

最后是我的 ChildViewController.m 文件。

#import "ChildViewController.h"
@interface ChildViewController ()
@end

@implementation ChildViewController
- (IBAction)dismissAndSave:(id)sender {
    //perform file-saving operations
    if ([self.delegate respondsToSelector:@selector(addEvent)]) {
        [self.delegate addEvent];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}
@end

我已经跑通调试了,最后一个 ChildViewController 不为 nil 的点是在父级的 prepareForSegue 方法中的[detailViewController setDelegate:self]; 行。

我知道我的委托方法没有被调用的原因是因为NSLog(@"We are before [self loadNewEvent];"); 没有发生。

除了没有被调用的方法之外,当我尝试在addEvent 委托方法中执行[self.tableView reloadData]; 时,所有内容都显示为空白。

提前感谢您的帮助;您为正在自学 iOS 编程和 Objective-C 方法的学生提供了很好的服务!

【问题讨论】:

  • 是否步入 if for respondsToSelector?
  • 我感觉您的“self.tableview”IBOutlet 属性未连接。哎呀,我什至没有看到它在您的 .h "@interface" 文件中声明。
  • @Ben Avery,我刚刚在 if 语句中添加了 NSLog(@"We are inside dismissAndSave respondsToSelector"); 行,但它没有打印出来。这大概就是问题所在。 @Michael Dautermann 我认为我不需要一个,因为在没有一个的情况下在发布时加载了信息。如果需要,如何在不破坏现有 tableView 的情况下进行设置?
  • 就在 if respondsToSelector 之前,delegate = nil?
  • 委托设置为 0x0

标签: ios iphone objective-c uitableview delegates


【解决方案1】:

扩展我的评论,我相信您需要在 .h 文件中声明一个 tableview 属性:

例如

@property (strong) IBOutlet UITableView *myTableView;

一旦连接到 Storyboard 或 XIB 中的实际表格视图,您就可以像这样在 .m 文件中引用:

[self.myTableView reloadData];

【讨论】:

  • 我将两者都添加到了我的代码中,但我将[self.myTableView reloadData]; 放入了我的 viewWillAppear 方法中,但没有运气。我是不是放错了方法?
  • 您是否将情节提要中的表格视图连接到视图控制器中的新“myTableView”插座?
  • 是的。整个东西周围有一个蓝色的盒子。
  • 哦,您需要将情节提要中的 tableview 对象的数据源设置回视图控制器,以便它知道从哪里提取数据。
  • ParentViewController 目前是dataSource 和delegate,myTableView 是“Reference Outlet”。似乎仍然没有重新加载数据。我是在错误的位置拨打电话还是我的 myTableView 连接到了错误的位置?
【解决方案2】:

看起来你正在分配一个新的视图控制器,设置它的委托,然后不做任何事情。一旦超出范围,它将被释放。

[(ChildViewController *)[[segue destinationViewController] topViewController] setFilePath:filePath];
ChildViewController *detailViewController = [[ChildViewController alloc] init];
[detailViewController setDelegate:self];

试试这样的...

ChildViewController * detailViewController = (id)[segue destinationViewController];
[detailViewController setDelegate:self];

【讨论】:

  • filePath参数怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多