我有一个项目,我在其中设置了一个协议(protocol)以将信息从一个 TableViewController 传回 ViewController。一切工作正常且符合预期,但我决定将导航 Controller 嵌入到 TableViewController 中,以便我可以添加一个“DONE”barButtonItem 以在用户完成时关闭 Controller 。由于嵌入在导航 Controller 中,该按钮运行良好,TablieViewController 看起来相同,但使用协议(protocol)和委托(delegate)的功能和方法都不起作用,如果我删除 NavigationController,一切都会正常。有人可以解释一下我该如何解决这个问题吗?我对 iOS 和 Objective c 相当陌生。
这里是NoteViewController中的prepareForSegue方法
- (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];
最佳答案
由于您的 TableView Controller 嵌入在导航 Controller 中,因此导航 Controller 将成为 segue 的目标 View Controller 。此外,最好为 if 语句使用 segue 的标识符,而不是目标 View Controller 的类(我使用“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;
}
关于ios - 与导航 Controller 的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28269437/