与导航控制器的协议
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;
}
}
我有一个项目,我在其中设置了一个协议以将信息从一个表 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;
}
}