我是iOS编程的新手,我遇到了问题 我遇到了自定义委托的问题。 我正在尝试做一个简单的自定义,它将数据返回到前一个视图控制器并弹出当前视图控制器。
我有2个导航视图控制器
1 - 主视图控制器 2 - 添加
这是在添加视图控制器中编写的协议
@protocol AddingDelegate <NSObject>
@required
-(void)setInformation:(Adding *)controller withObject:(Conference *)info;
这是我在添加视图控制器时调用它的地方
-(IBAction)addingConference
{
NSLog(@"Adding Button Pressed");
conferenceObject = [[Conference alloc]init];
conferenceObject.name = [NameTX text];
conferenceObject.city = [CityTX text];
conferenceObject.description = [Dectription text];
NSMutableArray *info = [[NSMutableArray alloc] init];
[info addObject:conferenceObject];
[self.delegate setInformation:self withObject:conferenceObject];
NSLog(@"adding Conference method is done");
}
我在主视图控制器的接口上编写了委托
@interface MainViewController : UITableViewController <AddingDelegate>
@end
这里我宣布了委托方法
-(void)setInformation:(Adding *)controller withArray:(NSMutableArray *)info
{
NSLog(@"in the main view at the delegate");
[self.navigationController popToRootViewControllerAnimated:YES];
NSLog(@"Should be popped right now");
}
这是对segue方法的准备
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"AddObject"]) {
UINavigationController *navigation = segue.destinationViewController;
Adding *addingViewController = [[navigation viewControllers]objectAtIndex:0];
addingViewController.delegate = self;
}
}
现在的问题是当我在堆栈顶部推送添加然后填写信息并按完成时,添加视图控制器不会弹出以显示主视图控制器。
我尝试记录所有内容,并且主视图控制器中的日志未显示。
请帮帮我
答案 0 :(得分:1)
我在这里注意到,在prepareForSegue:sender:
的实现中,segue的destinationViewController
是一个导航控制器。这让我觉得你的segue没有推动当前导航堆栈上的AddingController
,而是提出了一个新的导航堆栈。这意味着包含AddingController
的新导航控制器以模态方式呈现,因此,当您尝试弹出导航堆栈时,似乎没有任何事情发生,因为您在错误的导航堆栈上操作。如果是这种情况,您有两种选择:1。更改[self.navigationController popToRootViewControllerAnimated:YES];
的{{1}}或2.将segue更改为push segue而不是模态segue,并将segue直接指向{{1 }}
答案 1 :(得分:1)
在Adding.m中
@class Adding;
@protocol AddingDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end
@interface Adding : UIViewController
@property (weak, nonatomic) id <AddingDelegate> delegate; // have you forgot this one
@end
并使用
[self dismissViewControllerAnimated:YES completion:nil];
如果您想要返回上一个屏幕并确保添加了导航控制器,则需要关闭