iOS 使用委托传值不触发方法
iOS use the delegate pass value not trigger the method
我正在测试委托传递 objective-c 中的值。
我知道还有其他方法可以在 UIViewController 之间传递字符串,例如 NSNotifyCenter..等
现在我想尝试使用委托传递值。
但是我遇到了一些问题。
我使用导航,有两个 UIViewController(FirstUIViewcontroller 和 SecondUIViewController)。
现在我想使用手动更改为SecondUIViewController,而不是使用按钮拖动到FirstUIViewController处的SecondUIViewController。
所以我在 FirstUIViewController.m 按钮操作中添加了代码。
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[self.navigationController pushViewController:controller animated:YES];
}
然后我想在弹出视图控制器时从 SecondUIViewcontroller 传递值。
所以我添加了委托工具并在 FirstUIViewController.m 中设置了委托。
- (void)viewDidLoad {
[super viewDidLoad];
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
secondVC = (SecondViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
secondVC.delegate = self;
}
-(void) passSecondVC:(SecondViewController *)vc didAddValue:(NSString *)str
{
NSLog(@"second str:%@",str);
}
在 SecondUIViewController.h 中,我声明了委托方法。
@class SecondViewController;
@protocol SecondViewControllerDelegate <NSObject>
@optional
-(void)passSecondVC:(SecondViewController*)vc didAddValue:(NSString*) str;
@end
@interface SecondViewController : UIViewController
@property (nonatomic,assign) id<SecondViewControllerDelegate> delegate;
- (IBAction)passValueDelegatBtnAction:(id)sender;
在SecondViewController.m,
当我点击按钮时会弹出自己的 uiviewcontroller 并将值传递给 FirstUIViewController。
- (IBAction)passValueDelegatBtnAction:(id)sender {
if( [self.delegate respondsToSelector:@selector(passSecondVC:didAddValue:)])
{
[self.delegate passSecondVC:self didAddValue:@"this is string from sencond vc"];
}
[self.navigationController popViewControllerAnimated:YES];
}
(我的问题)
但是在这种状态下,我总是取不到FirstUIViewController中delegate方法中的值。
我曾在 FirstViewController.m
中尝试过如下所示的其他方法
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSLog(@"segue");
id vc = segue.destinationViewController;
if( [vc isKindOfClass:[SecondViewController class]])
{
SecondViewController *secondVC = vc;
secondVC.delegate = self;
}
}
有同样的问题。
我无法从委托方法中获取值。
有谁知道问题出在哪里?
我post我的完整代码在here.
非常感谢。
我下载了你的代码并修复了它。
你不想要这条线。所以评论吧,
// UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
// secondVC = (SecondViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
// secondVC.delegate = self;
按如下方式编辑此方法,
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
controller.delegate = self;
[self.navigationController pushViewController:controller animated:YES];
}
也将此方法编辑如下,
- (IBAction)passValueDelegatBtnAction:(id)sender {
// if( [self.delegate respondsToSelector:@selector(passSecondVC:didAddValue:)])
// {
[self.delegate passSecondVC:self didAddValue:@"this is string from sencond vc"];
// }
[self.navigationController popViewControllerAnimated:YES];
}
好的!
从 viewDidLoad:
方法中删除代码并在推送 secondViewController 时设置委托。
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[controller setDelegate:self];
[self.navigationController pushViewController:controller animated:YES];
}
那到底出了什么问题?
答案:您在 viewDidLoad: 方法中创建了一个新对象,并将您的 firstViewController 设置为它的委托。现在,在推送时,您正在创建另一个未设置委托的 SecondViewController 对象。
您在 pushBtnAction 中忘记了一些代码..
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; // It's different to VC you init in viewDidLoad
controller.delegate = self; // you forgot....
[self.navigationController pushViewController:controller animated:YES];
}
prepareForSegue 在您使用 segue 导航时调用。
我正在测试委托传递 objective-c 中的值。
我知道还有其他方法可以在 UIViewController 之间传递字符串,例如 NSNotifyCenter..等
现在我想尝试使用委托传递值。
但是我遇到了一些问题。
我使用导航,有两个 UIViewController(FirstUIViewcontroller 和 SecondUIViewController)。
现在我想使用手动更改为SecondUIViewController,而不是使用按钮拖动到FirstUIViewController处的SecondUIViewController。
所以我在 FirstUIViewController.m 按钮操作中添加了代码。
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[self.navigationController pushViewController:controller animated:YES];
}
然后我想在弹出视图控制器时从 SecondUIViewcontroller 传递值。
所以我添加了委托工具并在 FirstUIViewController.m 中设置了委托。
- (void)viewDidLoad {
[super viewDidLoad];
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
secondVC = (SecondViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
secondVC.delegate = self;
}
-(void) passSecondVC:(SecondViewController *)vc didAddValue:(NSString *)str
{
NSLog(@"second str:%@",str);
}
在 SecondUIViewController.h 中,我声明了委托方法。
@class SecondViewController;
@protocol SecondViewControllerDelegate <NSObject>
@optional
-(void)passSecondVC:(SecondViewController*)vc didAddValue:(NSString*) str;
@end
@interface SecondViewController : UIViewController
@property (nonatomic,assign) id<SecondViewControllerDelegate> delegate;
- (IBAction)passValueDelegatBtnAction:(id)sender;
在SecondViewController.m,
当我点击按钮时会弹出自己的 uiviewcontroller 并将值传递给 FirstUIViewController。
- (IBAction)passValueDelegatBtnAction:(id)sender {
if( [self.delegate respondsToSelector:@selector(passSecondVC:didAddValue:)])
{
[self.delegate passSecondVC:self didAddValue:@"this is string from sencond vc"];
}
[self.navigationController popViewControllerAnimated:YES];
}
(我的问题) 但是在这种状态下,我总是取不到FirstUIViewController中delegate方法中的值。
我曾在 FirstViewController.m
中尝试过如下所示的其他方法 - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSLog(@"segue");
id vc = segue.destinationViewController;
if( [vc isKindOfClass:[SecondViewController class]])
{
SecondViewController *secondVC = vc;
secondVC.delegate = self;
}
}
有同样的问题。
我无法从委托方法中获取值。
有谁知道问题出在哪里?
我post我的完整代码在here.
非常感谢。
我下载了你的代码并修复了它。
你不想要这条线。所以评论吧,
// UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
// secondVC = (SecondViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
// secondVC.delegate = self;
按如下方式编辑此方法,
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
controller.delegate = self;
[self.navigationController pushViewController:controller animated:YES];
}
也将此方法编辑如下,
- (IBAction)passValueDelegatBtnAction:(id)sender {
// if( [self.delegate respondsToSelector:@selector(passSecondVC:didAddValue:)])
// {
[self.delegate passSecondVC:self didAddValue:@"this is string from sencond vc"];
// }
[self.navigationController popViewControllerAnimated:YES];
}
好的!
从 viewDidLoad:
方法中删除代码并在推送 secondViewController 时设置委托。
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[controller setDelegate:self];
[self.navigationController pushViewController:controller animated:YES];
}
那到底出了什么问题?
答案:您在 viewDidLoad: 方法中创建了一个新对象,并将您的 firstViewController 设置为它的委托。现在,在推送时,您正在创建另一个未设置委托的 SecondViewController 对象。
您在 pushBtnAction 中忘记了一些代码..
- (IBAction)pushBtnAction:(id)sender {
SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; // It's different to VC you init in viewDidLoad
controller.delegate = self; // you forgot....
[self.navigationController pushViewController:controller animated:YES];
}
prepareForSegue 在您使用 segue 导航时调用。