在 popViewController Animated 中传回字符串
Passing string back in popViewControllerAnimated
我有一个 UIViewController(1),我按下该控制器中的一个视图,然后它推送另一个 UIViewController(2),其中有一个全屏 UITableView。
然后我按下 UITableView 中的一个单元格,并想将 UITableView 中的一个字符串传回给 UIViewController(1)。我试过使用下面的 delegete 方法但是它不起作用,请有人建议。
UIViewController2.h
@protocol SecondDelegate <NSObject>
-(void) secondViewControllerDismissed:(NSString *)stringForFirst;
@end
@interface ViewController2 : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
@end
和
UIViewController2.m (inside didSelectRowAtIndexPath)
[self.myDelegate secondViewControllerDismissed:@"the string I'm passing"];
和
UIViewController1.h
import "ViewController2.h"
@interface ViewController1 : UIViewController <SecondDelegate>
@end
和
UIViewController1.m
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *myString = stringForFirst;
self.myLabel.text = myString;
}
几件事:
- 删除
@interface ViewController2
中的 id myDelegate;
- 将您的
@property (nonatomic, assign) id...
更改为 @property (nonatomic, weak) id...
,这样更安全(参见 why)
关于你的问题:你是通过segue呈现视图的!?因此,您需要覆盖prepareForSegue
方法,从segue
中提取destinationViewController
并将其delegate
属性设置为self
。否则,您的 ViewController2 永远不会获得有效的委托集。所有需要在 viewController presenting ViewController2
:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
[super prepareForSegue:segue sender:sender];
if ([segue.identifier isEqualToString:@"yourCustomSegueIdentifier"]) {
ViewController2 *controller = (ViewController2*)segue.destinationViewController;
controller. myDelegate = self;
}
}
要么在故事板中设置您的 segue 的标识符,并在上面的颂歌中使用相同的标识符,要么一起删除 if(不干净)。
我有一个 UIViewController(1),我按下该控制器中的一个视图,然后它推送另一个 UIViewController(2),其中有一个全屏 UITableView。
然后我按下 UITableView 中的一个单元格,并想将 UITableView 中的一个字符串传回给 UIViewController(1)。我试过使用下面的 delegete 方法但是它不起作用,请有人建议。
UIViewController2.h
@protocol SecondDelegate <NSObject>
-(void) secondViewControllerDismissed:(NSString *)stringForFirst;
@end
@interface ViewController2 : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
@end
和
UIViewController2.m (inside didSelectRowAtIndexPath)
[self.myDelegate secondViewControllerDismissed:@"the string I'm passing"];
和
UIViewController1.h
import "ViewController2.h"
@interface ViewController1 : UIViewController <SecondDelegate>
@end
和
UIViewController1.m
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *myString = stringForFirst;
self.myLabel.text = myString;
}
几件事:
- 删除
@interface ViewController2
中的 - 将您的
@property (nonatomic, assign) id...
更改为@property (nonatomic, weak) id...
,这样更安全(参见 why)
id myDelegate;
关于你的问题:你是通过segue呈现视图的!?因此,您需要覆盖prepareForSegue
方法,从segue
中提取destinationViewController
并将其delegate
属性设置为self
。否则,您的 ViewController2 永远不会获得有效的委托集。所有需要在 viewController presenting ViewController2
:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
[super prepareForSegue:segue sender:sender];
if ([segue.identifier isEqualToString:@"yourCustomSegueIdentifier"]) {
ViewController2 *controller = (ViewController2*)segue.destinationViewController;
controller. myDelegate = self;
}
}
要么在故事板中设置您的 segue 的标识符,并在上面的颂歌中使用相同的标识符,要么一起删除 if(不干净)。