【发布时间】:2023-03-04 00:25:01
【问题描述】:
我是代表团的新手,所以我一直在寻找答案,我查看了method delegates doesn't get called 和Delegate 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