执行授权



我想我在了解委派的工作原理,这是我遵循的教程,但我在某个地方搞砸了。我希望我的代表参加NSLog,但事实并非如此。有人能发现我遗漏了什么或做错了什么吗?

我的MainViewController.h:

@interface MainViewController : UITableViewController < AddClassDelegate >

MainViewController.m

- (void)cancelAddingClass {
    NSLog(@"Canceled Yo");
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
/*
 When a row is selected, the segue creates the detail view controller as the destination.
 Set the detail view controller's detail item to the item associated with the selected row.
 */
if ([[segue identifier] isEqualToString:@"addClassSegue"]) {
    UINavigationController *nc = (UINavigationController *)segue.destinationViewController;
    AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0];
    addClassVC.delegate = self;
}

我的模式视图控制器AddClassViewController.h:

@protocol AddClassDelegate <NSObject>
- (void)cancelAddingClass;
@end
@interface AddClassViewController : UITableViewController
@property (weak, nonatomic) id< AddClassDelegate > delegate;
- (IBAction)cancelButtonPressed:(id)sender;

AddClassViewController.m

@synthesize delegate;
- (IBAction)cancelButtonPressed:(id)sender {
    [self.delegate cancelAddingClass];
}
cancelButtonPressed: 

已连接到序列图像板中模式视图的"取消"按钮。

您的代码看起来不错,这表明问题出在我们看不到的地方。我的猜测是:

AddClassViewController *addClassVC = [segue destinationViewController];
addClassVC.delegate = self;
NSLog(@"segued");

您是否在导航控制器中嵌入了模态视图控制器?如果是,destinationViewController将为您提供导航控制器,而不是AddClassViewController。检查调试器中实际存在的类addClassVC。

如果它是一个导航控制器,那么没问题,您只需要使用.viewControllers属性来访问实际的VC。在几行上使其更易于理解:

UINavigationController *nc = (UINavigationController *)segue.destinationViewController;
AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0];
addClassVC.delegate = self;

你可以用更少的行来完成,但这是一个混乱的强制转换和嵌套的括号,很难调试。

您的主视图控制器是否可能被释放?这将设置对nil的弱引用,并且您发送给代理的消息将被忽略,因为您将发送nil消息。

一切都是完美的。我没有看到任何问题。在各处保留断点并对其进行调试。

最新更新