与导航控制器的协议

Protocols with Navigation Controller

我有一个项目,我在其中设置了一个协议以将信息从一个表 ViewController 传回 ViewController。一切都按预期正常工作,但我决定将导航控制器嵌入到 TableViewController 中,这样我就可以添加一个 "DONE" barButtonItem 以在用户完成后关闭控制器。由于嵌入在导航控制器中,该按钮运行良好,TablieViewController 看起来相同,但其使用协议和委托的功能和方法的 none 有效,如果我删除 NavigationController 一切正常。有人可以解释我如何解决这个问题吗?我是 iOS 和 objective c 的新手。

这里是注释中的prepareForSegue方法ViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.destinationViewController isKindOfClass:[ToolTableViewController class]]) {
    ToolTableViewController *targetVC = segue.destinationViewController;
    targetVC.toolDelegate = self;
    targetVC.autoCorrectIsOn = self.autoCorrectIsOn;
    targetVC.undoAvailable = self.undoAvailable;
    targetVC.redoAvailable = self.redoAvailable;
}

}

ToolTableViewController.h

@protocol ToolTableViewControllerDelegate <NSObject>                              
@property (weak, nonatomic) id <ToolTableViewControllerDelegate> toolDelegate;

ToolTableViewController.m - 调用方法的示例

-(void)clearInputText{
//    NSLog(@"Clear Method Selected");
[self.toolDelegate didClearInputText];

}

NoteViewController.m

-(void)didClearInputText{
self.noteTextView.text = @"";
[self dismissViewControllerAnimated:YES completion:nil];

}

您的委托方法调用得很好(基于您粘贴的示例)。

由于您的控制器现在已嵌入到导航控制器中,因此您应该使用: [self.navigationController popViewControllerAnimated:YES]

之前,您以模态方式呈现您的控制器,这就是为什么 dismissViewController 当时工作正常但现在不行(在导航控制器的上下文中)。

由于您的 table 视图控制器嵌入在导航控制器中,导航控制器将成为 segue 的目标视图控制器。此外,最好为 if 语句使用 segue 的标识符,而不是目标视图控制器的 class (我使用 "SegueToTable" 作为标识符,将其更改为任何你放入标识符)。因此,prepareForSegue 应该是这样的,

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"SegueToTable"]) {
        UINavigationController *nav = segue.destinationViewController;
        ToolTableViewController *targetVC = nav.topViewController;
        targetVC.toolDelegate = self;
        targetVC.autoCorrectIsOn = self.autoCorrectIsOn;
        targetVC.undoAvailable = self.undoAvailable;
        targetVC.redoAvailable = self.redoAvailable;
    }

}